private NonGenericEventDelegate AddDelegate <T>(EventDelegate <T> del) where T : GameEvent { // Early-out if we've already registered this delegate if (delegateLookup.ContainsKey(del)) { return(null); } // Create a new non-generic delegate which calls our generic one. // This is the delegate we actually invoke. NonGenericEventDelegate internalDelegate = (GameEvent evt) => { del.Invoke(evt as T); }; delegateLookup[del] = internalDelegate; Type type = typeof(T); NonGenericEventDelegate tempDel; if (delegates.TryGetValue(type, out tempDel)) { delegates[type] = tempDel += internalDelegate; } else { delegates[type] = internalDelegate; } return(internalDelegate); }
public void AddListenerOnce <T>(EventDelegate <T> del) where T : GameEvent { NonGenericEventDelegate result = AddDelegate <T>(del); if (result != null) { // remember this is only called once onceLookups[result] = true; } }
public void AddListenerOnce <T>(EventDelegate <T> del) where T : GameEvent { EventDelegate <T> fn = null; fn = (T evt) => { del(evt); RemoveListener(fn); }; NonGenericEventDelegate result = AddDelegate(fn); }