static public T[] GetInvocationList <T>(string eventType) { Delegate d; //создадим делегат if (eventTable.TryGetValue(eventType, out d)) {//если eventType найден в справочнике событий eventTable, записываем в делегат d само событие, возвращаем его как очередной член массива делегатов try { return(d.GetInvocationList().Cast <T>().ToArray());//повторяем рекурсивно, чтобы собрать всех Listener-ов, подписанных на событие } catch { throw MessengerInternalSpecial.CreateBroadcastSignatureException(eventType); } } return(null); }
static public void Broadcast(string eventType, MessengerMode mode) { MessengerInternal.OnBroadcasting(eventType, mode); var invocationList = MessengerInternal.GetInvocationList <Action>(eventType); //получим список всех Action-делегатов (без параметров) по событию if (invocationList != null) //фиксы от Арти { foreach (Action callback in invocationList) { callback.Invoke(); //запускаем все из полученного списка } } MessengerInternalSpecial.OnBroadcasting(eventType, mode); var invocationList2 = MessengerInternalSpecial.GetInvocationList <Action <string> >(eventType); if (invocationList2 != null)//фиксы от Арти { foreach (var callback in invocationList2) { callback.Invoke(eventType); } } }
static public void Broadcast <TReturn>(string eventType, Action <TReturn> returnCall, MessengerMode mode) { MessengerInternal.OnBroadcasting(eventType, mode); var invocationList = MessengerInternal.GetInvocationList <Func <TReturn> >(eventType); if (invocationList != null)//фиксы от Арти { foreach (var result in invocationList.Select(del => del.Invoke()).Cast <TReturn>()) { returnCall.Invoke(result); } } MessengerInternalSpecial.OnBroadcasting(eventType, mode); var invocationList2 = MessengerInternalSpecial.GetInvocationList <Func <string, TReturn> >(eventType); if (invocationList2 != null)//фиксы от Арти { foreach (var result in invocationList2.Select(del => del.Invoke(eventType)).Cast <TReturn>()) { returnCall.Invoke(result); } } }
static public void RemoveListener <TReturn>(string eventType, Func <string, TReturn> handler) { MessengerInternalSpecial.RemoveListener(eventType, handler); }
static public void RemoveListener(string eventType, Action <string> handler) { MessengerInternalSpecial.RemoveListener(eventType, handler); }
static public void RemoveListener(string eventType, Delegate handler) { MessengerInternalSpecial.OnListenerRemoving(eventType, handler); eventTable[eventType] = Delegate.Remove(eventTable[eventType], handler); MessengerInternalSpecial.OnListenerRemoved(eventType); }
static public readonly MessengerMode DEFAULT_MODE = MessengerMode.DONT_REQUIRE_LISTENER;/*MessengerMode.REQUIRE_LISTENER;*/ static public void AddListener(string eventType, Delegate callback) { MessengerInternalSpecial.OnListenerAdding(eventType, callback); eventTable[eventType] = Delegate.Combine(eventTable[eventType], callback); }