1.先定义事件参数类: EventArgs 是基类,不建议直接使用,因为通用的东西针对性不强,容易混乱(特别是找bug 的时候)... MyEvent 的具体的派生类,建议的使用方法就是每个种类的事件派生一个类,比如UIEvent,ServerEvent神马的,根据具体作用来命名.
-
-
-
- public class EventArgs
- {
- public object Parameter;
- }
-
-
-
-
- public class MyEvent : EventArgs
- {
- public int ID;
- public string Name;
- }
2. 事件管理类: 可以看出是一个单例类,世界各地都能直接调用. _delegates负责保存所有事件接收方法,事件被按类型存在里面,同一个类型无论几条记录都只占一个项(所以不用遍历大串的方法列表)
-
-
-
- public class EventManager
- {
-
- public static readonly EventManager Instance = new EventManager();
- private EventManager() { }
-
-
- public delegate void EventDelegate<T>(T e) where T : EventArgs;
-
-
- readonly Dictionary<Type, Delegate> _delegates = new Dictionary<Type, Delegate>();
-
-
- public void AddListener<T>(EventDelegate<T> listener) where T : EventArgs
- {
- Delegate d;
- if (_delegates.TryGetValue(typeof(T), out d))
- {
- _delegates[typeof(T)] = Delegate.Combine(d, listener);
- }
- else
- {
- _delegates[typeof(T)] = listener;
- }
- }
-
-
- public void RemoveListener<T>(EventDelegate<T> listener) where T : EventArgs
- {
- Delegate d;
- if (_delegates.TryGetValue(typeof(T), out d))
- {
- Delegate currentDel = Delegate.Remove(d, listener);
-
- if (currentDel == null)
- {
- _delegates.Remove(typeof(T));
- }
- else
- {
- _delegates[typeof(T)] = currentDel;
- }
- }
- }
-
-
- public void Send<T>(T e) where T : EventArgs
- {
- if (e == null)
- {
- throw new ArgumentNullException("e");
- }
-
- Delegate d;
- if (_delegates.TryGetValue(typeof(T), out d))
- {
- EventDelegate<T> callback = d as EventDelegate<T>;
- if (callback != null)
- {
- callback(e);
- }
- }
- }
- }
3. 使用示例: 使用灰常简单,如下: 先添加一个事件接收方法(就是当事件被发出的时候会调用的接收方法), 然后需要触发事件时使用Send方法发送即可.
-
-
-
- public class Test
- {
- public Test()
- {
-
- EventManager.Instance.AddListener<MyEvent>(ReceiveEvent);
-
-
-
- MyEvent e = new MyEvent();
- e.ID =0;
- e.Name = "XOXOOX";
-
- EventManager.Instance.Send<MyEvent>(e);
- }
-
-
- public void ReceiveEvent(MyEvent e)
- {
-
- }
-
- }