internal class EventManager
{
private static EventManager _instance;
public static EventManager Instance
{
get
{
if (_instance == null)
{
_instance = new EventManager();
}
return _instance;
}
}
public delegate void EventDelegate<T>(T e) where T : EventArgs;
private 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 Raise<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);
}
}
}
/// <summary>
///触发一次后就移除这个类型的所有监听者.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="e"></param>
public void RaiseOnce<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)
{
//老的
Delegate old = (Delegate)d.Clone();
callback(e);
//新的
if (_delegates.ContainsKey(typeof(T)) == true)
{
Delegate newDel = Delegate.Remove(_delegates[typeof(T)], old);
if (newDel == null)
{
_delegates.Remove(typeof(T));
}
else
{
_delegates[typeof(T)] = newDel;
}
}
}
}
}
/// <summary>
/// 清除全部事件
/// </summary>
public void Clear()
{
_instance = null;
}
}
事件管理器
最新推荐文章于 2024-04-29 23:07:02 发布