使用反射调用匿名事件处理程序?

时间:2011-08-10 10:08:17

标签: c# asp.net

我已经为客户端 - 服务器UI框架实现了自己的事件注册,就像在ASP.NET中一样。我将一个事件的名称(例如“Click”)存储在字典中,并作为我记忆的值

oEventHandler.Method.DeclaringType.AssemblyQualifiedName.ToString() + "." + oEventHandler.Method.Name.

然后稍后重新调用事件处理程序,我重新创建委托:

var oEventHandler = Delegate.CreateDelegate( typeof( BLUIEventHandler ), oPage, sEventMethod, false )

并在页面上调用它:

oEventHandler.Invoke( oPage, this, oEventArgs );

这适用于作为ASPX页面一部分的事件处理程序,如

var oTheButton = new UIButton();
oTheButton.Click += this.HandleClick;
private void HandleClick() {}

但匿名代表失败:

var oTheButton = new UIButton();
oTheButton.Click += delegate {/* Will never be called. */};

非匿名委托的结果字符串是:

"MyTest.Rene.UI.Foo, BDRS, Version=8.10.1.19703, Culture=neutral, PublicKeyToken=null.HandleClick"

对于匿名代表,它是:

"MyTest.Rene.UI.Foo+<>c__DisplayClass1, MyTest, Version=8.10.1.17866, Culture=neutral, PublicKeyToken=null.<OnInitializeLayout>oTheButton__0"

但是当我尝试重新创建匿名委托时,我收到了绑定错误。 有没有办法回到匿名委托并调用它?

1 个答案:

答案 0 :(得分:3)

这对于匿名方法的一般情况永远不会起作用,因为非常很有可能涉及捕获的变量,并且您不会知道要捕获的值(加上您改变了性质:原始闭包可以更新捕获的变量 - 它们不是孤立的副本。)

就我个人而言,我认为你应该存储Delegate实例 - 而不是名称。 EventHandlerList是实现此功能的典型方式(每个事件都包含唯一的object个密钥)。