Получить список обработчиков определенного события из статического класса, используя отражение - PullRequest
0 голосов
/ 07 октября 2018

Редактировать: используется .Net Framework 3.5 (устаревший код Unity3D)

Во внешней библиотеке есть статический класс со статическим событием.Упрощенно до этого:

internal static class Eventie {

    public delegate void Something();

    public static event Something OnSomething;

}

Мне нужно получить для него существующие обработчики событий и вызвать один из них из моего кода.Примерно так:

List<Something> delegates = typeOf(Eventie).GetEventHandlersFor(nameof(OnSomething));
delegates.Where(...).ForEach(smth => smth.Invoke()); // pseudo code here

Существует решение , которое работает для нестатических классов, и я успешно использовал его для вмешательства в событие AppDomain.CurrentDomain.AssemblyResolve, но онопринимает параметр экземпляра , что делает невозможным (afaik) использование со статическим классом, который я получил.

1 Ответ

0 голосов
/ 07 октября 2018

Решение:

// get event field by name
FieldInfo info = typeof(Eventie).GetFields(AllBindings).First(fi => fi.Name == "OnSomething");

// can be null if no event handler delegates added
var eventValue = info.GetValue(null /* static we are */) as Eventie.Something; 

// and here is it; mind the null coalescing - can be null too
Eventie.Something[] invocations = eventValue?.GetInvocationList().Cast<Eventie.Something>().ToArray();

Чтобы удалить обработчик событий:

EventInfo ei = typeof(Eventie).GetEvent(nameof(Eventie.OnSomething));
ei.RemoveEventHandler(null, invocations[i]); // where i is an index
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...