Ejemplo n.º 1
0
        public T GetInstance <T>()
        {
            object instance = new TmEvent();
            T      retv     = (T)instance;

            return(retv);
        }
Ejemplo n.º 2
0
        public void Dispatch(object eventType, object data)
        {
            //Scrub the data to make eventType and data conform if possible
            if (eventType == null)
            {
                throw new EventDispatcherException("Attempt to Dispatch to null.\ndata: " + data, EventDispatcherExceptionType.EVENT_KEY_NULL);
            }
            else if (eventType is IEvent)
            {
                //Client provided a full-formed event
                data      = eventType;
                eventType = (data as IEvent).type;
            }
            else if (data == null)
            {
                //Client provided just an event ID. Create an event for injection
                data = new TmEvent(eventType, this, null);
            }
            else if (data is IEvent)
            {
                //Client provided both an evertType and a full-formed IEvent
                (data as IEvent).type = eventType;
            }
            else
            {
                //Client provided an eventType and some data which is not a IEvent.
                data = new TmEvent(eventType, this, data);
            }

            bool continueDispatch = true;

            if (triggerClients != null)
            {
                isTriggeringClients = true;
                foreach (ITriggerable trigger in triggerClients)
                {
                    if (!trigger.Trigger(eventType, data))
                    {
                        continueDispatch = false;
                    }
                }
                if (triggerClientRemovals != null)
                {
                    flushRemovals();
                }
                isTriggeringClients = false;
            }

            if (!continueDispatch)
            {
                return;
            }

            IEventBinding binding = GetBinding(eventType) as IEventBinding;

            if (binding == null)
            {
                return;
            }

            object[] callbacks = binding.value as object[];

            if (callbacks == null)
            {
                return;
            }

            int bb = callbacks.Length;

            for (int b = 0; b < bb; b++)
            {
                object   callback   = callbacks [b];
                object[] parameters = null;
                if (callback is EventCallback)
                {
                    parameters     = new object[1];
                    parameters [0] = data;
                    EventCallback evtCb = callback as EventCallback;

                    try
                    {
                        evtCb(parameters [0] as IEvent);
                    }
                    catch (InvalidCastException)
                    {
                        object tgt        = evtCb.Target;
                        string methodName = (callback as Delegate).Method.Name;
                        string message    = "An EventCallback is attempting an illegal cast. One possible reason is not typing the payload to IEvent in your callback. Another is illegal casting of the data.\nTarget class: " + tgt + " method: " + methodName;
                        throw new EventDispatcherException(message, EventDispatcherExceptionType.TARGET_INVOCATION);
                    }
                }
                else if (callback is EmptyCallback)
                {
                    parameters = new object[0];
                    EmptyCallback emptyCb = callback as EmptyCallback;
                    emptyCb();
                }
            }
        }