Есть ли какое-то скрытое свойство класса, которое позволит это знать?
Как отслеживать подписчиков на событие в С#?
Ответ 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
.