kyuskoj 发表于 2022-9-30 10:40

基于c#写一个EventCenter事件管理器

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;            if (d != null && d.GetType() != callBack.GetType())            {                throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件对应的委托类型是{1},需要添加的委托类型是{2}", str, d.GetType(), callBack.GetType()));            }      }      static void OnListenerRemoving(string str, Delegate callBack)      {            if (m_EventTable.ContainsKey(str))            {                Delegate d = m_EventTable;                if (d == null)                {                  throw new Exception(string.Format("移除监听错误:当前事件{0}没有对应的委托",str));                }                if (d.GetType() != callBack.GetType())                {                  throw new Exception(string.Format("移除监听错误:尝试为事件{0}移除不同类型的委托,当前事件对应的委托类型是{1},需要移除的委托类型是{2}", str, d.GetType(), callBack.GetType()));                }            }            else            {                throw new Exception(string.Format("移除监听错误:没有这个事件{0}",str));            }      }      static void OnListenerRemoved(string str)      {            if (m_EventTable == null)            {                m_EventTable.Remove(str);            }      }      //1个参数添加监听方法      public static void AddListener<T>(string str, CallBack<T> callBack)      {            OnListenerAdding(str, callBack);            m_EventTable = (CallBack<T>)m_EventTable + callBack;      }      ////2个参数移除监听方法      public static void RemoveListener<T,X>(string str, CallBack<T,X> callBack)      {            OnListenerRemoving(str, callBack);            m_EventTable = (CallBack<T, X>)m_EventTable - 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("广播事件错误:当前事件{0}具有不同类型的委托", 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个参数、两个参数的监听,如果需要其它参数的情况自己按照例子添加就行了,感谢观看!!!
页: [1]
查看完整版本: 基于c#写一个EventCenter事件管理器