using System; using System.Collections.Generic; namespace KTGMGemClient { /// /// 事件中心基类 /// public class EventBase { //携带不同参数个数的委托(系统自带的Action 只有四个参数) public delegate void CallBack(); public delegate void CallBack(T arg); public delegate void CallBack(T arg1, X arg2); public delegate void CallBack(T arg1, X arg2, Y arg3); public delegate void CallBack(T arg1, X arg2, Y arg3, Z arg4); public delegate void CallBack(T arg1, X arg2, Y arg3, Z arg4, W arg5); //存放各种事件的字典 protected Dictionary m_EventTable = new Dictionary(); #region 私有方法 private void OnListenerAdding(int eventType, Delegate callback) { if (!m_EventTable.ContainsKey(eventType)) { m_EventTable.Add(eventType, null); } Delegate del = m_EventTable[eventType]; //判断该事件码对应的事件类型(参数)是否一样 if (del != null && del.GetType() != callback.GetType()) { throw new Exception(string.Format("尝试添加事件失败")); } } private void OnListenerRemoving(int eventType, Delegate callback) { if (m_EventTable.ContainsKey(eventType)) { Delegate del = m_EventTable[eventType]; if (del == null) { throw new Exception(string.Format("移除失败,对应事件为空")); } else if (del.GetType() != callback.GetType()) { throw new Exception(string.Format("移除失败,对应事件不同")); } } else { throw new Exception(string.Format("移除失败,事件码为空")); } } private void OnListenerRemoved(int eventType) { if (m_EventTable[eventType] == null) { m_EventTable.Remove(eventType); } } #endregion //下面方法自行扩展 #region 没有参数,只传回调 //添加事件 public void Add(int eventType, CallBack callback) { OnListenerAdding(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback; } //移除事件 public void Remove(int eventType, CallBack callback) { OnListenerRemoving(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback; OnListenerRemoved(eventType); } //事件的广播 public void BroadCast(int eventType) { Delegate del; if (m_EventTable.TryGetValue(eventType, out del)) { CallBack callback = del as CallBack; if (callback != null) { callback(); } else { throw new Exception(string.Format("广播事件错误,对应事件为空")); } } } #endregion #region 一个参数 //添加事件 public void Add(int eventType, CallBack callback) { OnListenerAdding(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback; } //移除事件 public void Remove(int eventType, CallBack callback) { OnListenerRemoving(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback; OnListenerRemoved(eventType); } //事件的广播 public void BroadCast(int eventType, T arg) { Delegate del; if (m_EventTable.TryGetValue(eventType, out del)) { CallBack callback = del as CallBack; if (callback != null) { callback(arg); } else { throw new Exception(string.Format("广播事件错误,对应事件为空")); } } } #endregion #region 两个参数 //添加事件 public void Add(int eventType, CallBack callback) { OnListenerAdding(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback; } //移除事件 public void Remove(int eventType, CallBack callback) { OnListenerRemoving(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback; OnListenerRemoved(eventType); } //事件的广播 public void BroadCast(int eventType, T arg1, X arg2) { Delegate del; if (m_EventTable.TryGetValue(eventType, out del)) { CallBack callback = del as CallBack; if (callback != null) { callback(arg1, arg2); } else { throw new Exception(string.Format("广播事件错误,对应事件为空")); } } } #endregion #region 三个参数 //添加事件 public void Add(int eventType, CallBack callback) { OnListenerAdding(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback; } //移除事件 public void Remove(int eventType, CallBack callback) { OnListenerRemoving(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback; OnListenerRemoved(eventType); } //事件的广播 public void BroadCast(int eventType, T arg1, X arg2, Y arg3) { Delegate del; if (m_EventTable.TryGetValue(eventType, out del)) { CallBack callback = del as CallBack; if (callback != null) { callback(arg1, arg2, arg3); } else { throw new Exception(string.Format("广播事件错误,对应事件为空")); } } } #endregion #region 四个参数 //添加事件 public void Add(int eventType, CallBack callback) { OnListenerAdding(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback; } //移除事件 public void Remove(int eventType, CallBack callback) { OnListenerRemoving(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback; OnListenerRemoved(eventType); } //事件的广播 public void BroadCast(int eventType, T arg1, X arg2, Y arg3, Z arg4) { Delegate del; if (m_EventTable.TryGetValue(eventType, out del)) { CallBack callback = del as CallBack; if (callback != null) { callback(arg1, arg2, arg3, arg4); } else { throw new Exception(string.Format("广播事件错误,对应事件为空")); } } } #endregion #region 五个参数 //添加事件 public void Add(int eventType, CallBack callback) { OnListenerAdding(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback; } //移除事件 public void Remove(int eventType, CallBack callback) { OnListenerRemoving(eventType, callback); m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback; OnListenerRemoved(eventType); } //事件的广播 public void BroadCast(int eventType, T arg1, X arg2, Y arg3, Z arg4, W arg5) { Delegate del; if (m_EventTable.TryGetValue(eventType, out del)) { CallBack callback = del as CallBack; if (callback != null) { callback(arg1, arg2, arg3, arg4, arg5); } else { throw new Exception(string.Format("广播事件错误,对应事件为空")); } } } #endregion } }