C#如何查找是否挂接事件
我希望能够确定事件是否已挂断。我环顾四周,但只发现了涉及修改包含事件的对象内部的解决方案。我不想这么做
这是一些我认为可行的测试代码:
// Create a new event handler that takes in the function I want to execute when the event firesEventHandler myEventHandler = new EventHandler(myObject_SomeEvent);
// Get "p1" number events that got hooked up to myEventHandler
int p1 = myEventHandler.GetInvocationList().Length;
// Now actually hook an event up
myObject.SomeEvent += m_myEventHandler;
// Re check "p2" number of events hooked up to myEventHandler
int p2 = myEventHandler.GetInvocationList().Length;
上面的不幸是完全错误的。我以为以某种方式将事件挂接到myEventHandler中的“
invocationList”会自动更新。但是,不是这样。它的长度总是归为一。
无论如何,是否可以从包含该事件的对象外部确定这一点?
回答:
C#event
关键字呈现一种微妙的错觉,即一个事件具有一个调用列表。
如果使用C#event
关键字声明事件,则编译器将在您的类中生成一个私有委托,并为您管理它。每当您订阅事件时,add
都会调用编译器生成的方法,该方法会将事件处理程序追加到委托的调用列表中。没有该事件的显式调用列表。
因此,获得委托人的调用列表的唯一方法是:
- 使用反射来访问编译器生成的委托,或者
- 创建一个非私有委托(也许是内部委托)并手动实现事件的添加/删除方法(这可防止编译器生成事件的默认实现)
这是演示后一种技术的示例。
class MyType{
internal EventHandler<int> _delegate;
public event EventHandler<int> MyEvent;
{
add { _delegate += value; }
remove { _delegate -= value; }
}
}
以上是 C#如何查找是否挂接事件 的全部内容, 来源链接: utcz.com/qa/400212.html