|
using System.Collections.Generic;using System;namespace EventCenterTool{ public class EventCenter { //定义一个字典用来存储委托事件 static Dictionary<string,Delegate> m_EventTable = new Dictionary<string,Delegate>(); static void OnListenerAdding(string str, Delegate callBack) { //检查当前字典是否存在事件str,没有就添加一个null事件 if (!m_EventTable.ContainsKey(str)) { m_EventTable.Add(str, null); } Delegate d = m_EventTable[str]; if (d != null && d.GetType() != callBack.GetType()) { throw new Exception(string.Format(&#34;尝试为事件{0}添加不同类型的委托,当前事件对应的委托类型是{1},需要添加的委托类型是{2}&#34;, str, d.GetType(), callBack.GetType())); } } static void OnListenerRemoving(string str, Delegate callBack) { if (m_EventTable.ContainsKey(str)) { Delegate d = m_EventTable[str]; if (d == null) { throw new Exception(string.Format(&#34;移除监听错误:当前事件{0}没有对应的委托&#34;,str)); } if (d.GetType() != callBack.GetType()) { throw new Exception(string.Format(&#34;移除监听错误:尝试为事件{0}移除不同类型的委托,当前事件对应的委托类型是{1},需要移除的委托类型是{2}&#34;, str, d.GetType(), callBack.GetType())); } } else { throw new Exception(string.Format(&#34;移除监听错误:没有这个事件{0}&#34;,str)); } } static void OnListenerRemoved(string str) { if (m_EventTable[str] == null) { m_EventTable.Remove(str); } } //1个参数添加监听方法 public static void AddListener<T>(string str, CallBack<T> callBack) { OnListenerAdding(str, callBack); m_EventTable[str] = (CallBack<T>)m_EventTable[str] + callBack; } ////2个参数移除监听方法 public static void RemoveListener<T,X>(string str, CallBack<T,X> callBack) { OnListenerRemoving(str, callBack); m_EventTable[str] = (CallBack<T, X>)m_EventTable[str] - callBack; OnListenerRemoved(str); } //无参数广播监听方法 public static void BroadCast(string str) { Delegate d;#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。 if (m_EventTable.TryGetValue(str,out d))#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型。 { CallBack? callBack = d as CallBack; if (callBack == null) { throw new Exception(string.Format(&#34;广播事件错误:当前事件{0}具有不同类型的委托&#34;, str)); } else callBack(); } } }}public delegate void CallBack();public delegate void CallBack<T>(T arg1);public delegate void CallBack<T, X>(T arg1, X arg2);
上面我分别写了无参、1个参数、两个参数的监听,如果需要其它参数的情况自己按照例子添加就行了,感谢观看!!! |
|