private static void HookEvent(UIElement that, EventBinding eventBinding) { if (!_handlerTable.TryGetValue(that, out var subTable)) { subTable = new Dictionary <string, EventHandlerHolder>(); _handlerTable.Add(that, subTable); } string eventName = eventBinding.EventName; if (subTable.ContainsKey(eventName)) { throw new InvalidOperationException($"An event binding for the '{eventName}' event already exists."); } EventHandlerHolder handlerHolder = new EventHandlerHolder(eventBinding); subTable[eventName] = handlerHolder; EventInfo eventInfo = that.GetType().GetEvent(eventName) ?? throw new Exception($"The target object does not have an event named '{eventName}'."); MethodInfo methodInfo = handlerHolder.GetType().GetMethod(nameof(EventHandlerHolder.HandleEvent), BindingFlags.Instance | BindingFlags.Public); Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, handlerHolder, methodInfo); eventInfo.AddEventHandler(that, handler); }
private static void UnHookEvent(UIElement that, EventBinding eventBinding) { string eventName = eventBinding.EventName; EventHandlerHolder handlerHolder = _handlerTable[that][eventName]; EventInfo eventInfo = that.GetType().GetEvent(eventName); MethodInfo methodInfo = handlerHolder.GetType().GetMethod(nameof(EventHandlerHolder.HandleEvent), BindingFlags.Instance | BindingFlags.Public); Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, handlerHolder, methodInfo); eventInfo.RemoveEventHandler(that, handler); _handlerTable[that].Remove(eventName); }