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