【C#】Event事件(基础) 工具类
2020-07-31 12:08
1291 查看
格式都差不多,属于单播事件
/* *自定义委托,指定无返回值的方法(函数)【用无返回值做代表-_-】 */ public delegate void CallBack(); public delegate void CallBack<T>(T arg); public delegate void CallBack<T, X>(T arg1, X arg2); public delegate void CallBack<T, X, Y>(T arg1, X arg2, Y arg3);
/* *事件钥匙【自行添加钥匙】 */ public enum EventDefine { None, }
using System; using System.Collections.Generic; /* *事件控制中心,处理事件添加监听、移除、安全校验、触发调用 */ public class EventCenter { //事件存储集合 Dictionary<事件钥匙,委托类型> private static Dictionary<EventDefine, Delegate> m_EventTable = new Dictionary<EventDefine, Delegate>(); //添加事件时安全校验,对事件类型进行判断 private static void OnListenerAdding(EventDefine eventType, Delegate callBack) { if (!m_EventTable.ContainsKey(eventType)) { m_EventTable.Add(eventType, null); } Delegate d = m_EventTable[eventType]; if (d != null && d.GetType() != callBack.GetType()) { throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1},要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType())); } } //移除指定事件的指定委托时,进行安全校验 private static void OnListenerRemoving(EventDefine eventType, Delegate callBack) { if (m_EventTable.ContainsKey(eventType)) { Delegate d = m_EventTable[eventType]; if (d == null) { throw new Exception(string.Format("移除监听错误:事件{0}没有对应的委托", eventType)); } else if (d.GetType() != callBack.GetType()) { throw new Exception(string.Format("移除监听错误:尝试为事件{0}移除不同类型的委托,当前委托类型为{1},要移除的委托类型为{2}", eventType, d.GetType(), callBack.GetType())); } } else { throw new Exception(string.Format("移除监听错误:没有事件码{0}", eventType)); } } //移除事件对应的委托后,删除对应的事件 private static void OnListenerRemoved(EventDefine eventType) { if (m_EventTable[eventType] == null) { m_EventTable.Remove(eventType); } } //添加 委托的方法为无参数的事件监听 public static void AddListener(EventDefine eventType, CallBack callBack) { OnListenerAdding(eventType, callBack); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callBack; } //添加 委托的方法为一个泛型参数的事件监听 public static void AddListener<T>(EventDefine eventType, CallBack<T> callBack) { OnListenerAdding(eventType, callBack); m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] + callBack; } //添加 委托的方法为俩个泛型参数的事件监听 public static void AddListener<T, X>(EventDefine eventType, CallBack<T, X> callBack) { OnListenerAdding(eventType, callBack); m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] + callBack; } //添加 委托的方法为三个泛型参数的事件监听 public static void AddListener<T, X, Y>(EventDefine eventType, CallBack<T, X, Y> callBack) { OnListenerAdding(eventType, callBack); m_EventTable[eventType] = (CallBack<T, X, Y>)m_EventTable[eventType] + callBack; } //移除 委托的方法为无参数的事件监听 public static void RemoveListener(EventDefine eventType, CallBack callBack) { OnListenerRemoving(eventType, callBack); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callBack; OnListenerRemoved(eventType); } //移除 委托的方法为一个泛型参数的事件监听 public static void RemoveListener<T>(EventDefine eventType, CallBack<T> callBack) { OnListenerRemoving(eventType, callBack); m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] - callBack; OnListenerRemoved(eventType); } //移除 委托的方法为两个泛型参数的事件监听 public static void RemoveListener<T, X>(EventDefine eventType, CallBack<T, X> callBack) { OnListenerRemoving(eventType, callBack); m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] - callBack; OnListenerRemoved(eventType); } //移除 委托的方法为三个泛型参数的事件监听 public static void RemoveListener<T, X, Y>(EventDefine eventType, CallBack<T, X, Y> callBack) { OnListenerRemoving(eventType, callBack); m_EventTable[eventType] = (CallBack<T, X, Y>)m_EventTable[eventType] - callBack; OnListenerRemoved(eventType); } //触发(广播) 委托类型为无参数的事件 public static void Broadcast(EventDefine eventType) { Delegate d; if (m_EventTable.TryGetValue(eventType, out d)) { CallBack callBack = d as CallBack; if (callBack != null) { callBack(); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } //触发(广播) 委托类型为一个泛型参数的事件 public static void Broadcast<T>(EventDefine eventType, T arg) { Delegate d; if (m_EventTable.TryGetValue(eventType, out d)) { CallBack<T> callBack = d as CallBack<T>; if (callBack != null) { callBack(arg); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } //触发(广播) 委托类型为两个泛型参数的事件 public static void Broadcast<T, X>(EventDefine eventType, T arg1, X arg2) { Delegate d; if (m_EventTable.TryGetValue(eventType, out d)) { CallBack<T, X> callBack = d as CallBack<T, X>; if (callBack != null) { callBack(arg1, arg2); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } //触发(广播) 委托类型为三个泛型参数的事件 public static void Broadcast<T, X, Y>(EventDefine eventType, T arg1, X arg2, Y arg3) { Delegate d; if (m_EventTable.TryGetValue(eventType, out d)) { CallBack<T, X, Y> callBack = d as CallBack<T, X, Y>; if (callBack != null) { callBack(arg1, arg2, arg3); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } }
相关文章推荐
- C#基础笔记——委托(Delegate)和事件(Event)
- C# 基础18 event(事件)
- C#:代表(delegate)和事件(event)
- c#中的delegate(委托)和event(事件)
- 【MySQL基础】09:事件调度器(EVENT)
- C#的基础琐碎总结-----事件
- C#事件和委托的基础知识模型
- C#事件(event)解析
- C# 事件驱动基础
- [C# 基础知识系列]专题四:事件揭秘
- C#:代表(delegate)和事件(event)
- C#基础-委托事件和类(Day8)
- 静心学习—C# 事件Event(1)
- delegate(委托)、event(事件) 的基础知识
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- 【C#基础】之WinForm窗体常用控件的属性、方法及事件简介
- C#基础加强篇—委托、Lambda表达式和事件(下)
- C#调用API:mouse_event 模拟鼠标事件
- C#事件(event)解析 -- 新手必看
- C#事件(event)解析