using static ColorControl.Shared.EventDispatcher.EventExtensions; namespace ColorControl.Shared.EventDispatcher; public class EventDispatcher where T : EventArgs { private Dictionary> eventHandlers = new Dictionary>(); private Dictionary> asyncEventHandlers = new Dictionary>(); public void RegisterEventHandler(string eventName, EventHandler eventHandler) { if (!eventHandlers.ContainsKey(eventName)) { eventHandlers.Add(eventName, eventHandler); } else { eventHandlers[eventName] += eventHandler; } } public void RegisterAsyncEventHandler(string eventName, AsyncEventHandler eventHandler) { if (!asyncEventHandlers.ContainsKey(eventName)) { asyncEventHandlers.Add(eventName, eventHandler); } else { if (!asyncEventHandlers[eventName].GetInvocationList().Any(il => il.Target == eventHandler.Target)) { asyncEventHandlers[eventName] += eventHandler; } } } public void UnregisterEventHandler(string eventName) { eventHandlers.Remove(eventName); } public void DispatchEvent(string eventName, T eventArgs) { if (eventHandlers.ContainsKey(eventName)) { eventHandlers[eventName]?.Invoke(this, eventArgs); } } public async Task DispatchEventAsync(string eventName, T eventArgs) { if (asyncEventHandlers.ContainsKey(eventName)) { await asyncEventHandlers[eventName]?.InvokeAsync(this, eventArgs); } DispatchEvent(eventName, eventArgs); } protected bool HasHandlers(string eventName) { return eventHandlers.ContainsKey(eventName) || asyncEventHandlers.ContainsKey(eventName); } }