我们写一个类时,有时候会在同一个类上添加很多事件,事件很多的话,是不容易管理的,.NET提供的EventHandlerList可以辅助多个事件的管理,但不方便的地方是,它不是类型安全的,缺少类型安全,多少用起来担心会出错。经过我的一番改造,可以将系统提供的EventHandlerList通过泛型提供类型安全的管理。泛型类EventHandlerList.cs的实现如下:

 public sealed class EventHandlerList<T> : IDisposable
{
ListEntry head; public EventHandlerList()
{ } public Delegate this[T key]
{
get{
ListEntry e = Find(key);
return e == null ? null : e.m_handler;
}
set{
ListEntry e = Find(key);
if (e != null){
e.m_handler = value;
}
else {
head = new ListEntry(key, value, head);
}
}
} public void AddHandler(T key, Delegate value)
{
ListEntry e = Find(key);
if (e != null) {
e.m_handler = Delegate.Combine(e.m_handler, value);
}
else {
head = new ListEntry(key, value, head);
}
} public void AddHandlers(EventHandlerList<T> listToAddFrom)
{
ListEntry currentListEntry = listToAddFrom.head;
while (currentListEntry != null) {
AddHandler(currentListEntry.m_key, currentListEntry.m_handler);
currentListEntry = currentListEntry.m_next;
}
} public void Dispose()
{
head = null;
} private ListEntry Find(T key)
{
ListEntry found = head;
while (found != null) {
if (found.m_key.Equals(key)) {
break;
}
found = found.m_next;
}
return found;
} public void RemoveHandler(T key, Delegate value)
{
ListEntry e = Find(key);
if (e != null) {
e.m_handler = Delegate.Remove(e.m_handler, value);
}
} private sealed class ListEntry
{
internal ListEntry m_next;
internal T m_key;
internal Delegate m_handler; public ListEntry(T key, Delegate handler, ListEntry next)
{
m_next = next;
m_key = key;
m_handler = handler;
}
}
}

有了它,我们就可以改变多个事件的使用方式,例子类似于下面这个。

 public class DispatcherCore
{
readonly EventHandlerList<EventType> Events = new EventHandlerList<EventType>(); public event EventHandler OnReceiveData {
add {
Events.AddHandler(EventType.ReceiveData, value);
}
remove {
Events.RemoveHandler(EventType.ReceiveData, value);
}
} public event EventHandler OnRefreshData
{
add{
Events.AddHandler(EventType.RefreshData, value);
}
remove{
Events.RemoveHandler(EventType.RefreshData, value);
}
} private void RaiseEvent(EventType eventType, EventArgs args)
{
var raiseEvent = Events[eventType] as EventHandler; if (raiseEvent != null)
raiseEvent(this, args);
} // 其它逻辑,在适当的时候调用RaiseEvent private enum EventType
{
None,
ReceiveData,
RefreshData,
Error,
Info,
}
}

用起来更方便,很难出错。希望对大家有用。

最新文章

  1. Javascript实现HashTable类
  2. MongoDB-权限配置
  3. Could not load file or assembly or one of its dependencies. 试图加载格式不正确的程序。
  4. Json与javaBean之间的转换工具类
  5. Atitti.数字证书体系cer pfx attilax总结
  6. Android配置----adb工具的使用
  7. css做的后台管理页面,不考虑ie8一下的
  8. 访问Google搜索,Google学术镜像搜索
  9. ubuntu下启动和关闭tomcat的简单方法
  10. rhel-server-7.2-x86_64无法联网(VMware环境)
  11. 分布式发布订阅消息系统 Kafka 架构设计[转]
  12. maven + selenium + jenkins 教程收集
  13. Jmeter接口测试案例实践(一)
  14. MRC和ARC混编
  15. Windows命令行(DOS命令)教程-8 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_7.html
  16. Javascript学习8 - 脚本化文档(Document对象)
  17. poj2528 Mayor&#39;s posters(线段树区间覆盖)
  18. springMvc学习笔记一
  19. eclipse中使用workset整理项目
  20. Nexus 3 搭建 npm 私服 (windows)

热门文章

  1. (转)Mysql占用过高CPU时的优化手段
  2. mongo 授权访问
  3. 图说超线程技术(Hyper-Threading Technology)
  4. AbstractQueuedSynchronizer,ReentraLock部分代码分析
  5. Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动
  6. 如何用webgl(three.js)搭建不规则建筑模型,客流量热力图模拟
  7. Java 防SQL注入过滤器(拦截器)代码
  8. .net下 本地锁、redis分布式锁、zk分布式锁的实现
  9. JS实现最短路径之弗洛伊德(Floyd)算法
  10. C# 请求Https