示例#1
0
    public void AddEventHandler(string eventName, Element attachedTo, EventDelegate callbackDelegate)
    {
        if (!this.registeredEvents.ContainsKey(eventName))
        {
            return;
        }

        var registeredEvent        = this.registeredEvents[eventName];
        var registeredEventHandler = new RegisteredEventHandler()
        {
            EventName       = eventName,
            RegisteredEvent = registeredEvent,
            Delegate        = callbackDelegate,
            Element         = attachedTo,
        };

        this.registeredEventHandlers.Add(registeredEventHandler);

        void elementCheckingDelegate(object[] objects)
        {
            if (objects.First() is Element element)
            {
                if (element != attachedTo && !element.IsChildOf(attachedTo))
                {
                    return;
                }
            }

            if (objects.Length == 0)
            {
                callbackDelegate.DynamicInvoke(null, Array.Empty <object>());
            }
            else if (objects.Length == 1)
            {
                callbackDelegate.DynamicInvoke(objects.First(), Array.Empty <object>());
            }
            else
            {
                callbackDelegate.DynamicInvoke(objects.First(), objects.Skip(1));
            }
        }

        ScriptCallbackDelegateWrapper wrapper = new ScriptCallbackDelegateWrapper(elementCheckingDelegate, new());

        foreach (var element in this.elementRepository.GetAll())
        {
            if (registeredEvent.ElementType.IsAssignableFrom(element.GetType()))
            {
                var actions = (EventHandlerActions <Element>)registeredEvent.Delegate.DynamicInvoke(element, wrapper) !;
                actions.Add(element);
            }
        }
    }
示例#2
0
        private static EventProxy InternalRaises <T>(T target, EventInfo eventInfo, EventDelegate eventDelegate)
        {
            // this method to dynamically subscribe for events was taken from
            // http://www.codeproject.com/KB/cs/eventtracingviareflection.aspx
            EventProxy proxy = new EventProxy();
            Delegate   d     = Delegate.CreateDelegate(eventInfo.EventHandlerType, proxy, EventProxy.Handler);

            eventInfo.AddEventHandler(target, d);
            eventDelegate.DynamicInvoke();
            eventInfo.RemoveEventHandler(target, d);

            return(proxy);
        }