using GFramework.Core.Abstractions.events; namespace GFramework.Core.events; /// /// 泛型事件类,支持一个泛型参数 T 的事件注册、注销与触发。 /// 实现了 IEvent 接口以提供统一的事件操作接口。 /// /// 事件回调函数的第一个参数类型。 public class Event : IEvent { /// /// 存储已注册的事件处理委托。 /// 默认为空操作(no-op)委托,避免 null 检查。 /// private Action? _mOnEvent = _ => { }; /// /// 显式实现 IEvent 接口中的 Register 方法。 /// 允许使用无参 Action 来订阅当前带参事件。 /// /// 无参事件处理方法。 /// IUnRegister 对象,用于稍后注销该事件监听器。 IUnRegister IEvent.Register(Action onEvent) { return Register(Action); void Action(T _) { onEvent(); } } /// /// 注册一个事件监听器,并返回可用于取消注册的对象。 /// /// 要注册的事件处理方法。 /// IUnRegister 对象,用于稍后注销该事件监听器。 public IUnRegister Register(Action onEvent) { _mOnEvent += onEvent; return new DefaultUnRegister(() => UnRegister(onEvent)); } /// /// 取消指定的事件监听器。 /// /// 需要被注销的事件处理方法。 public void UnRegister(Action onEvent) { _mOnEvent -= onEvent; } /// /// 触发所有已注册的事件处理程序,并传递参数 t。 /// /// 传递给事件处理程序的参数。 public void Trigger(T t) { _mOnEvent?.Invoke(t); } /// /// 获取当前已注册的监听器数量 /// /// 监听器数量 public int GetListenerCount() { return _mOnEvent?.GetInvocationList().Length ?? 0; } } /// /// 支持两个泛型参数 T 和 TK 的事件类。 /// 提供事件注册、注销和触发功能。 /// /// 第一个参数类型。 /// 第二个参数类型。 public class Event : IEvent { /// /// 存储已注册的双参数事件处理委托。 /// 默认为空操作(no-op)委托。 /// private Action? _mOnEvent = (_, _) => { }; /// /// 显式实现 IEvent 接口中的 Register 方法。 /// 允许使用无参 Action 来订阅当前带参事件。 /// /// 无参事件处理方法。 /// IUnRegister 对象,用于稍后注销该事件监听器。 IUnRegister IEvent.Register(Action onEvent) { return Register(Action); void Action(T _, Tk __) { onEvent(); } } /// /// 注册一个接受两个参数的事件监听器,并返回可用于取消注册的对象。 /// /// 要注册的事件处理方法。 /// IUnRegister 对象,用于稍后注销该事件监听器。 public IUnRegister Register(Action onEvent) { _mOnEvent += onEvent; return new DefaultUnRegister(() => UnRegister(onEvent)); } /// /// 取消指定的双参数事件监听器。 /// /// 需要被注销的事件处理方法。 public void UnRegister(Action onEvent) { _mOnEvent -= onEvent; } /// /// 触发所有已注册的事件处理程序,并传递参数 t 和 k。 /// /// 第一个参数。 /// 第二个参数。 public void Trigger(T t, Tk k) { _mOnEvent?.Invoke(t, k); } /// /// 获取当前已注册的监听器数量 /// /// 监听器数量 public int GetListenerCount() { return _mOnEvent?.GetInvocationList().Length ?? 0; } }