Как отслеживать подписчиков на событие в 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.