}; // class HookedEvent // Add a handler for a specific event. internal void AddHandler(EventId eventId, Delegate handler) { lock(this) { HookedEvent current = hookedEvents; while(current != null) { if(current.eventId == eventId) { current.handler = Delegate.Combine(current.handler, handler); return; } current = current.next; } hookedEvents = new HookedEvent (eventId, handler, hookedEvents); } }
// Remove a handler from a specific event. internal void RemoveHandler(EventId eventId, Delegate handler) { lock(this) { HookedEvent current = hookedEvents; HookedEvent prev = null; while(current != null) { if(current.eventId == eventId) { current.handler = Delegate.Remove(current.handler, handler); if(current.handler == null) { if(prev != null) { prev.next = current.next; } else { hookedEvents = current.next; } } return; } prev = current; current = current.next; } } }
public HookedEvent(EventId eventId, Delegate handler, HookedEvent next) { this.eventId = eventId; this.handler = handler; this.next = next; }