public bool DispatchEvent <T>(T evt) where T : BaseEvent { Type type = evt.GetType(); if (!m_handlerTable.ContainsKey(type)) { return(false); } PriorityLinkedList <Delegate> priorityLinkedList = m_handlerTable[type]; LinkedListNode <ElementPriorityPair <Delegate> > linkedListNode = priorityLinkedList.First(); while (linkedListNode != null) { LinkedListNode <ElementPriorityPair <Delegate> > next = linkedListNode.Next; Delegate element = linkedListNode.Value.Element; if (element.Target.Equals(null)) { priorityLinkedList.Remove(linkedListNode.Value.Element); linkedListNode = next; continue; } if ((bool)element.DynamicInvoke(evt)) { return(true); } linkedListNode = linkedListNode.Next; } return(false); }
public bool DispatchEvent <T>(T evt) where T : struct { Type typeFromHandle = typeof(T); if (!m_handlerTable.ContainsKey(typeFromHandle)) { return(false); } PriorityLinkedList <EventHandlerDelegate <T> > handlerList = GetHandlerList <T>(); bool copyOnWrite = handlerList.CopyOnWrite; handlerList.CopyOnWrite = true; LinkedListNode <ElementPriorityPair <EventHandlerDelegate <T> > > linkedListNode = handlerList.First(); while (linkedListNode != null) { LinkedListNode <ElementPriorityPair <EventHandlerDelegate <T> > > next = linkedListNode.Next; EventHandlerDelegate <T> element = linkedListNode.Value.Element; if (element.Target != null && element.Target.Equals(null)) { handlerList.Remove(linkedListNode.Value.Element); linkedListNode = next; } else { try { if (handlerList.Contains(element) && element(evt)) { handlerList.CopyOnWrite = copyOnWrite; return(true); } } catch (Exception ex) { Log.LogErrorFormatted(this, "The event handler for event '{0}' threw an exception. Execution will continue but the game may be in a broken state.", typeof(T).FullName); Log.LogException(this, ex); } linkedListNode = next; } } handlerList.CopyOnWrite = copyOnWrite; return(false); }