/******************************************************************** 文件: EventCenter.cs 作者: 梦语 邮箱: 1982614048@qq.com 创建时间: 2024/03/29 17:28:19 最后修改: 梦语 最后修改时间: 2024/04/03 16:06:58 功能: 事件处理中心 使用方法: AddListener: EventCenter.AddListener(NetProtoType.IOCPReceive, IOCPMsgReceive); EventCenter.AddListener(MsgId.Regist, RegistEventDispose); RemoveListener: EventCenter.RemoveListener(NetProtoType.IOCPReceive, IOCPMsgReceive); EventCenter.RemoveListener(MsgId.Regist, RegistEventDispose); BroadCast: EventCenter.BroadCast((MsgId)msgData.msgId, session, msgData); EventCenter.BroadCast(NetProtoType.HTTPPostReceive, response, content); *********************************************************************/ using System; using System.Collections; using System.Collections.Generic; /// /// 事件处理 /// public class EventCenter { #region 枚举事件 private static Dictionary> enumEventDic = new Dictionary>(); private static void OnListenerAdding(T eventType, Delegate callBack) where T : Enum { Type type = eventType.GetType(); if (!enumEventDic.ContainsKey(type)) { enumEventDic.Add(type, new Dictionary()); } if (!enumEventDic[type].ContainsKey(eventType)) { enumEventDic[type].Add(eventType, null); } Delegate d = enumEventDic[type][eventType]; if (type != null && d != null && d.GetType() != callBack.GetType()) { throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托为{1},要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType())); } } private static void OnListenerRemoving(T eventType, Delegate callBack) where T : Enum { Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].ContainsKey(eventType)) { Delegate d = enumEventDic[type][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())); } return; } } throw new Exception(string.Format("移除监听错误:没有事件码{0}", eventType)); } private static void OnListenerRemoved(T eventType) where T : Enum { Type type = eventType.GetType(); if (enumEventDic[type][eventType] == null) { enumEventDic[type].Remove(eventType); } if (enumEventDic[type] == null || enumEventDic[type].Count == 0) { enumEventDic.Remove(type); } } //==================================================监听事件======================================================== /// /// 无参数监听 /// /// 事件 /// 回调 public static void AddListener(T eventType, Action callBack) where T : Enum { OnListenerAdding(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] + callBack; } /// /// 一个参数监听 /// /// 事件 /// 回调 public static void AddListener(T eventType, Action callBack) where T : Enum { OnListenerAdding(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] + callBack; } /// /// 两个参数监听 /// /// 事件 /// 回调 public static void AddListener(T eventType, Action callBack) where T : Enum { OnListenerAdding(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] + callBack; } /// /// 三个参数监听 /// /// 事件 /// 回调 public static void AddListener(T eventType, Action callBack) where T : Enum { OnListenerAdding(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] + callBack; } /// /// 四个参数监听 /// /// 事件 /// 回调 public static void AddListener(T eventType, Action callBack) where T : Enum { OnListenerAdding(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] + callBack; } /// /// 五个参数监听 /// /// 事件 /// 回调 public static void AddListener(T eventType, Action callBack) where T : Enum { OnListenerAdding(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] + callBack; } //==================================================移除监听======================================================== /// /// 无参移除监听 /// /// 事件 /// 回调 public static void RemoveListener(T eventType, Action callBack) where T : Enum { OnListenerRemoving(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] - callBack; OnListenerRemoved(eventType); } /// /// 一个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(T eventType, Action callBack) where T : Enum { OnListenerRemoving(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] - callBack; OnListenerRemoved(eventType); } /// /// 两个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(T eventType, Action callBack) where T : Enum { OnListenerRemoving(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] - callBack; OnListenerRemoved(eventType); } /// /// 三个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(T eventType, Action callBack) where T : Enum { OnListenerRemoving(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] - callBack; OnListenerRemoved(eventType); } /// /// 四个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(T eventType, Action callBack) where T : Enum { OnListenerRemoving(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] - callBack; OnListenerRemoved(eventType); } /// /// 五个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(T eventType, Action callBack) where T : Enum { OnListenerRemoving(eventType, callBack); enumEventDic[eventType.GetType()][eventType] = (Action)enumEventDic[eventType.GetType()][eventType] - callBack; OnListenerRemoved(eventType); } //==================================================广播事件======================================================== /// /// 无参广播事件 /// /// 事件 public static void BroadCast(T eventType) where T : Enum { Delegate d; Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } } /// /// 一个参数广播事件 /// /// 事件 public static void BroadCast(T eventType, K arg) where T : Enum { Delegate d; Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } } /// /// 两个参数广播事件 /// /// 事件 public static void BroadCast(T eventType, K arg1, X arg2) where T : Enum { Delegate d; Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } } /// /// 三个参数广播事件 /// /// 事件 public static void BroadCast(T eventType, K arg1, X arg2, Y arg3) where T : Enum { Delegate d; Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2, arg3); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } } /// /// 四个参数广播事件 /// /// 事件 public static void BroadCast(T eventType, K arg1, X arg2, Y arg3, Z arg4) where T : Enum { Delegate d; Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2, arg3, arg4); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } } /// /// 五个参数广播事件 /// /// 事件 public static void BroadCast(T eventType, K arg1, X arg2, Y arg3, Z arg4, W arg5) where T : Enum { Delegate d; Type type = eventType.GetType(); if (enumEventDic.ContainsKey(type)) { if (enumEventDic[type].TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2, arg3, arg4, arg5); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } } #endregion #region 普通事件 private static Dictionary normalEventDic = new Dictionary(); private static void OnListenerAdding(string eventType, Delegate callBack) { if (!normalEventDic.ContainsKey(eventType)) { normalEventDic.Add(eventType, null); } Delegate d = normalEventDic[eventType]; if (!string.IsNullOrEmpty(eventType) && d != null && d.GetType() != callBack.GetType()) { throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托为{1},要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType())); } } private static void OnListenerRemoving(string eventType, Delegate callBack) { if (normalEventDic.ContainsKey(eventType)) { Delegate d = normalEventDic[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())); } return; } throw new Exception(string.Format("移除监听错误:没有事件码{0}", eventType)); } private static void OnListenerRemoved(string eventType) { if (normalEventDic[eventType] == null) { normalEventDic.Remove(eventType); } } //==================================================监听事件======================================================== /// /// 无参数监听 /// /// 事件 /// 回调 public static void AddListener(string eventType, Action callBack) { OnListenerAdding(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; } /// /// 一个参数监听 /// /// 事件 /// 回调 public static void AddListener(string eventType, Action callBack) { OnListenerAdding(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; } /// /// 两个参数监听 /// /// 事件 /// 回调 public static void AddListener(string eventType, Action callBack) { OnListenerAdding(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; } /// /// 三个参数监听 /// /// 事件 /// 回调 public static void AddListener(string eventType, Action callBack) { OnListenerAdding(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; } /// /// 四个参数监听 /// /// 事件 /// 回调 public static void AddListener(string eventType, Action callBack) { OnListenerAdding(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; } /// /// 五个参数监听 /// /// 事件 /// 回调 public static void AddListener(string eventType, Action callBack) { OnListenerAdding(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; } //==================================================移除监听======================================================== /// /// 无参移除监听 /// /// 事件 /// 回调 public static void RemoveListener(string eventType, Action callBack) { OnListenerRemoving(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; OnListenerRemoved(eventType); } /// /// 一个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(string eventType, Action callBack) { OnListenerRemoving(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; OnListenerRemoved(eventType); } /// /// 两个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(string eventType, Action callBack) { OnListenerRemoving(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; OnListenerRemoved(eventType); } /// /// 三个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(string eventType, Action callBack) { OnListenerRemoving(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; OnListenerRemoved(eventType); } /// /// 四个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(string eventType, Action callBack) { OnListenerRemoving(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; OnListenerRemoved(eventType); } /// /// 五个参数移除监听 /// /// 事件 /// 回调 public static void RemoveListener(string eventType, Action callBack) { OnListenerRemoving(eventType, callBack); normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; OnListenerRemoved(eventType); } //==================================================广播事件======================================================== /// /// 无参广播事件 /// /// 事件 public static void BroadCast(string eventType) { Delegate d; if (normalEventDic.TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } /// /// 一个参数广播事件 /// /// 事件 public static void BroadCast(string eventType, K arg) { Delegate d; if (normalEventDic.TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } /// /// 两个参数广播事件 /// /// 事件 public static void BroadCast(string eventType, K arg1, X arg2) { Delegate d; if (normalEventDic.TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } /// /// 三个参数广播事件 /// /// 事件 public static void BroadCast(string eventType, K arg1, X arg2, Y arg3) { Delegate d; if (normalEventDic.TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2, arg3); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } /// /// 四个参数广播事件 /// /// 事件 public static void BroadCast(string eventType, K arg1, X arg2, Y arg3, Z arg4) { Delegate d; if (normalEventDic.TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2, arg3, arg4); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } /// /// 五个参数广播事件 /// /// 事件 public static void BroadCast(string eventType, K arg1, X arg2, Y arg3, Z arg4, W arg5) { Delegate d; if (normalEventDic.TryGetValue(eventType, out d)) { Action callBack = d as Action; if (callBack != null) { callBack(arg1, arg2, arg3, arg4, arg5); } else { throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", eventType)); } } } #endregion /// /// 清理 /// public static void Clear() { enumEventDic.Clear(); normalEventDic.Clear(); } }