是否有一些隐藏的类属性可以让你知道这个?
答案 0 :(得分:19)
如果您有权访问实际的委托(如果您使用的是速记event
语法,那么这只是在实际的声明类中,因为委托是private
),那么你可以致电GetInvocationList()
。
例如:
public event EventHandler MyEvent;
要获取订阅者列表,您可以致电:
Delegate[] subscribers = MyEvent.GetInvocationList();
如有必要,您可以检查Method
数组的每个元素的Target
和subscribers
属性。
这样做的原因是因为我们在上面实际所做的事件声明事件做了类似于此的事情:
private EventHandler myEventDelegate;
public event EventHandler MyEvent
{
add { myEventDelegate += value; }
remove { myEventDelegate -= value; }
}
这就是为什么从声明类中查看事件与其他任何地方(包括从中继承的类)相比,事件看起来不同。唯一面向公众的界面是add
和remove
功能;实际的委托,即持有订阅的委托,是private
。