示例#1
0
        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);
    }