C#
event关键字呈现一种微妙的错觉,即一个事件具有一个调用列表。
如果使用C#
event关键字声明事件,则编译器将在您的类中生成一个私有委托,并为您管理它。每当您订阅事件时,
add都会调用编译器生成的方法,该方法会将事件处理程序追加到委托的调用列表中。没有该事件的显式调用列表。
因此,获得委托人的调用列表的唯一方法是:
- 使用反射来访问编译器生成的委托,或者
- 创建一个非私有委托(也许是内部委托)并手动实现事件的添加/删除方法(这可防止编译器生成事件的默认实现)
这是演示后一种技术的示例。
class MyType{ internal EventHandler<int> _delegate; public event EventHandler<int> MyEvent; { add { _delegate += value; } remove { _delegate -= value; } }}


