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

use*_*291 11 .net c# events event-handling

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

Ada*_*son 19

如果您可以访问实际的委托(如果您使用的是速记event语法,那么这只是在实际的声明类中,就像委托一样private),那么您可以调用GetInvocationList().

例如:

public event EventHandler MyEvent;
Run Code Online (Sandbox Code Playgroud)

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

Delegate[] subscribers = MyEvent.GetInvocationList();
Run Code Online (Sandbox Code Playgroud)

然后,可以检查MethodTarget所述的每个元素的属性subscribers阵列,如果必要的话.

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

private EventHandler myEventDelegate;

public event EventHandler MyEvent
{
    add { myEventDelegate += value; }
    remove { myEventDelegate -= value; }
}
Run Code Online (Sandbox Code Playgroud)

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