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)
        {

        }
    }
复制代码

 

 

 

代码下载

 

posted @   ARM830  阅读(864)  评论(4编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示