Как я могу отслеживать подписчиков на событие в C #? - PullRequest
11 голосов
/ 06 февраля 2011

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

1 Ответ

19 голосов
/ 06 февраля 2011

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

...