前 注:这是自己平时根据自己需要写的一些小代码,为了避免再次数据丢失,所以放到网上来,未必对各看官有用。另外,这是根据个人想法而写,未必严谨和符合设计原则,若有任何不妥之处,还请不吝赐教。
特 性:
1、可在事件所有者外部触发。
2、增加Enabled属性用于禁用事件。使得无需清空响应和重新添加响应,便可达到暂时屏蔽事件的效果。
3、可异步响应。.NET内置事件的响应在调用者线程上执行。
4、事件委托限定为EventHandler<T>。
说 明:
1、一般情况下,在所有者外触发事件代表着不好的设计。事件既属于某个类,则触发它的权限自然也应属于且仅属于此类。但并非所有的情况都如此,例如有些事件既可通过界面操作触发,也可后台触发,甚至间接触发。
2、此组件在内部封装一个.NET事件,为了初始化该事件,此组件本应为泛型,其参数为事件的委托。但出于以下原因或考虑:一、.NET的泛型无法限定为委托类型(Delegate);二、对外提供强类型控制;三、EventHandler<T>为微软推荐的事件响应委托。故将事件委托限定为EventHandler<T>,此组件的泛型参数对应EventHandler<T>中的T。
示 例:略。
源 码:
/// <summary>
/// 事件源类,此类相当于扩展的事件
/// </summary>
/// <typeparam name="T">事件参数类型</typeparam>
public class EventSource<T> where T:EventArgs
{
#region Fields
/// <summary>
/// 事件对象
/// </summary>
private event EventHandler<T> _Event;
/// <summary>
/// 是否可用
/// </summary>
private bool _Enabled = true;
/// <summary>
/// 异步触发事件的线程池调用接口委托
/// </summary>
private WaitCallback _AsyncRaiseCallBack;
#endregion
#region Properties
/// <summary>
/// 事件对象
/// </summary>
public event EventHandler<T> Event
{
add
{
this._Event += value;
}
remove
{
this._Event -= value;
}
}
/// <summary>
/// 是否可用:若设置为true,则Raise函数将不会触发事件
/// </summary>
public bool Enabled
{
get { return _Enabled; }
set { _Enabled = value; }
}
/// <summary>
/// 异步触发事件的线程池调用接口委托
/// </summary>
private WaitCallback AsyncRaiseCallBack
{
get
{
if (_AsyncRaiseCallBack == null)
{
_AsyncRaiseCallBack = new WaitCallback(RaiseEventCallBack);
}
return _AsyncRaiseCallBack;
}
}
#endregion
#region Methods
/// <summary>
/// 触发事件
/// </summary>
/// <param name="sender">发送方</param>
/// <param name="args">参数</param>
public void Raise(object sender, T args)
{
if (Enabled && _Event != null)
{
_Event(sender, args);
}
}
/// <summary>
/// 异步触发事件
/// </summary>
/// <param name="sender">发送方</param>
/// <param name="args">参数</param>
/// <param name="Async">是否异步触发</param>
public void Raise(object sender, T args,bool Async)
{
if (!Enabled || _Event == null) return;
if (Async)
{
Pair<object, T> context = new Pair<object, T>(sender, args);
ThreadPool.QueueUserWorkItem(AsyncRaiseCallBack, context);
}
else
{
_Event(sender, args);
}
}
/// <summary>
/// 异步触发事件的线程池入口函数
/// </summary>
private void RaiseEventCallBack(object ThreadContext)
{
Pair<object, T> context = ThreadContext as Pair<object, T>;
_Event(context.First, context.Second);
}
/// <summary>
/// 添加响应
/// </summary>
/// <param name="Response">响应</param>
/// <returns>事件源</returns>
public static EventSource<T> operator +(EventSource<T> Source, EventHandler<T> Response)
{
Source.Event += Response;
return Source;
}
/// <summary>
/// 添加响应
/// </summary>
/// <param name="Response">响应</param>
/// <returns>事件源</returns>
public static EventSource<T> operator -(EventSource<T> Source, EventHandler<T> Response)
{
Source.Event -= Response;
return Source;
}
/// <summary>
/// 添加响应
/// </summary>
/// <param name="Response"></param>
public void Add(EventHandler<T> Response)
{
this._Event += Response;
}
public void Remove(EventHandler<T> Response)
{
this._Event -= Response;
}
#endregion
}