自定义的事件管理器
自定义的事件管理器
周银辉
大多数框架下都提供了事件管理器的,但不使用框架时为了让事件发送者和事件接收者之间解耦,就可以如下写个简单的
public enum EventAdministratorEventTypes { ApplicationStartup, //在这里添加你需要的事件 } public class EventAdministratorEventArgs : EventArgs { public object Arg { get; protected set; } public EventAdministratorEventArgs(object arg) { Arg = arg; } } public class EventAdministrator { private static EventAdministrator instance; public static EventAdministrator Instance { get { return instance ?? (instance = new EventAdministrator()); } } /// <summary> /// 用于存储event和它对于的回调函数列表的字典(event 和 callback是一对多的关系) /// </summary> private readonly Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>> eventAndCallbackBuffer = new Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>>(); private void AddCallbackForEvent(EventAdministratorEventTypes eventName, EventHandler<EventAdministratorEventArgs> callback) { if (!eventAndCallbackBuffer.ContainsKey(eventName)) { eventAndCallbackBuffer.Add(eventName, new List<EventHandler<EventAdministratorEventArgs>>()); } var callbackList = eventAndCallbackBuffer[eventName]; //添加时判定不存在为了防止多次注册后引起多次调用回调函数 if (!callbackList.Contains(callback)) { callbackList.Add(callback); } } /// <summary> /// 注册为事件接受者 /// </summary> /// <param name="eventName">事件名称</param> /// <param name="callback">事件发生时的回调函数</param> public void Register(EventAdministratorEventTypes eventName, EventHandler<EventAdministratorEventArgs> callback) { AddCallbackForEvent(eventName, callback); } /// <summary> /// 触发一个事件 /// </summary> /// <param name="sender">触发者</param> /// <param name="eventName">事件名称</param> /// <param name="args">触发该事件时所带的参数</param> public void Send(object sender, EventAdministratorEventTypes eventName, EventAdministratorEventArgs args) { if (!eventAndCallbackBuffer.ContainsKey(eventName)) { Logger.Warning("EventAdministrator:事件"+eventName+"被触发,但没有任何对象注册该事件." + " 导致这个情况的原因可能有:代码中没有调用相应的Register函数来注册该事件; 或者 事件的Send函数发生在Register之前"); return; } var callbackList = eventAndCallbackBuffer[eventName]; foreach (var callback in callbackList) { callback.Invoke(sender, args); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?