WPF 实现简易事件聚合
一直很心水棱镜(Prism)的事件聚合器。
看了下源代码,代码不多,但是东西真的不少。
简单的实现了一下,没有弱引用,没有线程安全,没有线程级别。
总的来说 原理还是很好理解的。
有点像观察者,或者说就是?
总共分为订阅,发布,通过一个单例总管。
内部设有一个字典和集合,保管引发实例和引发事件。
简单的画了个图
几处比较有意思的代码
字典保存对象
public TArg GetEvent<TArg>() where TArg : EventBase, new() { if (!EventTypeName.TryGetValue(typeof(TArg), out EventBase eventBase)) { var EventArgClass = new TArg(); if (EventArgClass != null) { EventTypeName[typeof(TArg)] = EventArgClass; } return EventArgClass; } else return (TArg)eventBase; }
引发事件
public Action<object[]> DoAction() { if (this.Action != null) { return args => { if (args != null && args[0] != null) { var d = default(TArg); d = (TArg)args[0]; ((Action<TArg>)Action)(d); } }; } return null; }
使用方式
public class Test : MethodSetting { } public class Test2 : MethodSetting<string> { } class Program { static void Main(string[] args) { EventManager.Instance.GetEvent<Test>().SetMethod(GetTest); EventManager.Instance.GetEvent<Test2>().SetMethod(GetTest2); EventManager.Instance.GetEvent<Test>().Push(); EventManager.Instance.GetEvent<Test2>().Push("Test"); EventManager.Instance.GetEvent<Test>().RemoveMethod(new Action(GetTest)); EventManager.Instance.GetEvent<Test2>().RemoveMethod(new Action<string>(GetTest2)); EventManager.Instance.GetEvent<Test>().Push(); EventManager.Instance.GetEvent<Test2>().Push("Test"); } private static void GetTest() { } private static void GetTest2(string obj) { } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现