Приводить весь листинг я не хочу. Он длинноват. А работает так :
(методы-расширения)
Регистрация :
public static void MessageRegister(this object entryPoint, string messageName, Action messageListener)
Но, предпочитаю использовать второй вариант, без стрингов (меньше мусора в GC) :
public static void MessageRegister(this object entryPoint, MessageName messageName, Action messageListener)
(MessageName - enum с быстрым доступом к кешированному стринг-значению)
Так же, имеются перегрузки для делегатов с параметрами (до пяти параметров)
Пример :
public static void MessageRegister<T0, T1, T2, T3, T4>(this object entryPoint, string messageName, Action<T0, T1, T2, T3, T4> messageListener)
Дерегистрация :
public static void MessageUnRegister(this object entryPoint, string messageName, Action messageListener)
public static void MessageUnRegister(this object entryPoint, MessageName messageName, Action messageListener)
Вызов цепочки :
public static void MessageCall(this object entryPoint, string messageName)
или
public static void MessageCall(this object entryPoint, MessageName messageName)
или для цепочек с параметрами :
public static void MessageCall<T0, T1, T2, T3, T4>(this object entryPoint, string messageName, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
Для максимальной скорости, рекомендую не использовать стринги. От них много мусора в GC (особенно это может быть чувствительно на мобилках). В моём текущем менеджере я не до конца от них избавился, всё руки не доходят. В результате это создаёт 16 байтов мусора за кадр. Не критично, впрочем, потому руки и не доходят.
Вот как-то так. Весь код менеджера занимает 540 строк (с пустыми и форматированием). Львиная доля - многочисленные перегрузки методов. Является частью моей новой системы модульного программирования, которую я ещё не готов опубликовать для широкой общественности. Успешно использовался к примеру в этом проекте. Показал себя бодро
foreach не использую. Прокручиваю цепочки через for