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