List<object> targets = MyEvent.GetInvocationList().Select(d => d.Target).ToList();
Выполнение этого с помощью отражения будет несколько запутано, если вообще возможно, к сожалению, потому что этот синтаксис:
public event EventHandler MyEvent;
...
MyEvent(this, EventArgs.Empty);
Является синтаксическим сахаром. Что это на самом деле делает:
private EventHandler compilerGeneratedName;
public event EventHandler MyEvent
{
add { compilerGeneratedName += value; }
remove { compilerGeneratedName -= value; }
}
...
compilerGeneratedName(this, EventArgs.Empty);
Другими словами, события всегда имели декларативное сокращение, которое свойства получали только недавно. В результате, чтобы попасть в список вызовов, вам нужно проверить закрытую переменную, которая названа компилятором (если, конечно, вы не используете произвольный синтаксис самостоятельно и не знаете имя переменной экземпляра).
Нет прямого способа связать внешнюю выставленную конструкцию event
с обработчиком поддержки, кроме как с прямым способом связать property
с резервной переменной: именно потому, что не обязательно отношения один-к-одному . Очень вероятно, что есть, но, как правило, так не должно быть.
Вы можете попробовать использовать отражение, чтобы проверить закрытые переменные, которые имеют правильный тип EventHandler<>
в типе, который объявляет событие (обратите внимание, что вам придется сделать это в конкретном типе , который объявляет событие, , а не в подклассе) и проверяет, можете ли вы определить какую-либо корреляцию с именами, но это в лучшем случае ненадежное решение.