如何在C#中跟踪订阅者?

时间:2011-02-06 01:54:56

标签: c# .net events event-handling

是否有一些隐藏的类属性可以让你知道这个?

1 个答案:

答案 0 :(得分:19)

如果您有权访问实际的委托(如果您使用的是速记event语法,那么这只是在实际的声明类中,因为委托是private),那么你可以致电GetInvocationList()

例如:

public event EventHandler MyEvent;

要获取订阅者列表,您可以致电:

Delegate[] subscribers = MyEvent.GetInvocationList();

如有必要,您可以检查Method数组的每个元素的Targetsubscribers属性。

这样做的原因是因为我们在上面实际所做的事件声明事件做了类似于此的事情:

private EventHandler myEventDelegate;

public event EventHandler MyEvent
{
    add { myEventDelegate += value; }
    remove { myEventDelegate -= value; }
}

这就是为什么从声明类中查看事件与其他任何地方(包括从中继承的类)相比,事件看起来不同。唯一面向公众的界面是addremove功能;实际的委托,即持有订阅的委托,是private