using System.Collections.Concurrent; using GFramework.Core.Abstractions.events; namespace GFramework.Core.events; /// /// EasyEvents事件管理器类,用于全局事件的注册、获取和管理 /// 提供了类型安全的事件系统,支持泛型事件的自动创建和检索 /// 线程安全:所有公共方法都是线程安全的 /// public class EasyEvents { /// /// 全局单例事件管理器实例 /// private static readonly EasyEvents MGlobalEvents = new(); /// /// 存储事件类型与事件实例映射关系的字典(线程安全) /// private readonly ConcurrentDictionary _mTypeEvents = new(); /// /// 获取指定类型的全局事件实例 /// /// 事件类型,必须实现IEasyEvent接口 /// 指定类型的事件实例,如果未注册则返回默认值 public static T Get() where T : IEvent { return MGlobalEvents.GetEvent(); } /// /// 注册指定类型的全局事件 /// /// 事件类型,必须实现IEasyEvent接口且具有无参构造函数 public static void Register() where T : IEvent, new() { MGlobalEvents.AddEvent(); } /// /// 获取或添加指定类型的全局事件 /// /// 事件类型,必须实现IEasyEvent接口且具有无参构造函数 /// 指定类型的事件实例 public static T GetOrAdd() where T : IEvent, new() { return MGlobalEvents.GetOrAddEvent(); } /// /// 添加指定类型的事件到事件字典中 /// /// 事件类型,必须实现IEasyEvent接口且具有无参构造函数 /// 当事件类型已存在时抛出 public void AddEvent() where T : IEvent, new() { if (!_mTypeEvents.TryAdd(typeof(T), new T())) { throw new ArgumentException($"Event type {typeof(T).Name} already registered."); } } /// /// 获取指定类型的事件实例 /// /// 事件类型,必须实现IEasyEvent接口 /// 指定类型的事件实例,如果不存在则返回默认值 public T GetEvent() where T : IEvent { return _mTypeEvents.TryGetValue(typeof(T), out var e) ? (T)e : default!; } /// /// 获取指定类型的事件实例,如果不存在则创建并添加到事件字典中 /// /// 事件类型,必须实现IEasyEvent接口且具有无参构造函数 /// 指定类型的事件实例 public T GetOrAddEvent() where T : IEvent, new() { return (T)_mTypeEvents.GetOrAdd(typeof(T), _ => new T()); } }