Как отслеживать подписчиков на событие в С#?

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

Ответ 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.