AI智能
改变未来

【C#】Event事件(基础) 工具类

格式都差不多,属于单播事件

/**自定义委托,指定无返回值的方法(函数)【用无返回值做代表-_-】*/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));}}}}
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 【C#】Event事件(基础) 工具类