public void AddListener <T>(EventHandler <T> listener) where T : EventArgs { var eventType = typeof(T); var key = new BroadcastHandlerKey(eventType, listener); if (_delegateLookup.ContainsKey(key)) { return; } EventHandler internalDelegate = (s, e) => listener(s, (T)e); _delegateLookup[key] = internalDelegate; EventHandler invoker; if (_delegates.TryGetValue(eventType, out invoker)) { invoker += internalDelegate; _delegates[eventType] = invoker; } else { _delegates[eventType] = internalDelegate; } }
public void RemoveListener <T>(EventHandler <T> listener) where T : EventArgs { var eventType = typeof(T); var key = new BroadcastHandlerKey(eventType, listener); EventHandler internalDelegate; if (_delegateLookup.TryGetValue(key, out internalDelegate)) { EventHandler invoker; if (_delegates.TryGetValue(eventType, out invoker)) { invoker -= internalDelegate; if (invoker == null) { _delegates.Remove(eventType); } else { _delegates[eventType] = invoker; } } _delegateLookup.Remove(key); } }
protected bool Equals(BroadcastHandlerKey other) { return(_eventType == other._eventType && _handler == other._handler); }