public void RemoveListener <T>(int sourceId, EventHandler <T> listener) where T : EventArgs { var eventType = typeof(T); var handlerKey = new SingleHandlerKey(sourceId, eventType, listener); EventHandler internalDelegate; if (_specificLookup.TryGetValue(handlerKey, out internalDelegate)) { var eventKey = new SingleEventKey(sourceId, eventType); EventHandler invoker; if (_specificDelegates.TryGetValue(eventKey, out invoker)) { invoker -= internalDelegate; if (invoker == null) { _specificDelegates.Remove(eventKey); } else { _specificDelegates[eventKey] = invoker; } } _specificLookup.Remove(handlerKey); } }
// TODO: Maybe instead of sourceId take object source and store object.GetHashCode() public void AddListener <T>(int sourceId, EventHandler <T> listener) where T : EventArgs { var eventType = typeof(T); var handlerKey = new SingleHandlerKey(sourceId, eventType, listener); if (_specificLookup.ContainsKey(handlerKey)) { return; } EventHandler internalDelegate = (s, e) => listener(s, (T)e); _specificLookup[handlerKey] = internalDelegate; var eventKey = new SingleEventKey(sourceId, eventType); EventHandler invoker; if (_specificDelegates.TryGetValue(eventKey, out invoker)) { invoker += internalDelegate; _specificDelegates[eventKey] = invoker; } else { _specificDelegates[eventKey] = internalDelegate; } }
protected bool Equals(SingleEventKey other) { return(_id == other._id && _eventType == other._eventType); }