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
}
}