我已经为客户端 - 服务器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"
但是当我尝试重新创建匿名委托时,我收到了绑定错误。 有没有办法回到匿名委托并调用它?
答案 0 :(得分:3)
这对于匿名方法的一般情况永远不会起作用,因为非常很有可能涉及捕获的变量,并且您不会知道要捕获的值(加上您改变了性质:原始闭包可以更新捕获的变量 - 它们不是孤立的副本。)
就我个人而言,我认为你应该存储Delegate
实例 - 而不是名称。 EventHandlerList
是实现此功能的典型方式(每个事件都包含唯一的object
个密钥)。