博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EventHandlerList z
阅读量:6365 次
发布时间:2019-06-23

本文共 3455 字,大约阅读时间需要 11 分钟。

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

public sealed class EventHandlerList
: 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
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
Events = new EventHandlerList
(); 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, } }

 

转载地址:http://jsama.baihongyu.com/

你可能感兴趣的文章
解决:sudo: 无法解析主机:dinphy-500-310cn: 连接超时
查看>>
Asp.Net多线程用法1
查看>>
exFAT是支持Mac和Win的
查看>>
(转)postman中 form-data、x-www-form-urlencoded、raw、binary的区别
查看>>
js Date操作
查看>>
判断用户密码是否在警告期内(学习练习)
查看>>
sp_executesql的执行计划会被重用(转载)
查看>>
禅道项目管理软件插件开发
查看>>
Linux系统各发行版镜像下载
查看>>
JS获取键盘按下的键值event.keyCode,event.charCode,event.which的兼容性
查看>>
查看ORACLE 数据库及表信息
查看>>
腾讯、百度、阿里面试经验—(1) 腾讯面经
查看>>
Codeforces Round #374 (Div. 2) D. Maxim and Array 贪心
查看>>
HTML DOM 教程Part1
查看>>
GBDT的基本原理
查看>>
MySQL修改root密码的多种方法(转)
查看>>
MongoDB 基础命令——数据库表的增删改查——遍历操作表中的记录
查看>>
.NET Core 跨平台发布(dotnet publish)
查看>>
Activity入门(一)
查看>>
CentOS下如何从vi编辑器插入模式退出到命令模式
查看>>