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); } } }
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); }