Как отслеживать подписчиков на событие в C#?

есть ли какое-то скрытое свойство класса, которое позволило бы это узнать ?

1 ответов


если у вас есть доступ к фактическому делегату (если вы используете стенографию 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.