WPF 實現簡易事件聚合

一直很心水棱鏡(Prism)的事件聚合器。安全

看了下源代碼,代碼很少,可是東西真的很多。this

簡單的實現了一下,沒有弱引用,沒有線程安全,沒有線程級別。spa

 

總的來講 原理仍是很好理解的。線程

 

有點像觀察者,或者說就是?code

 

總共分爲訂閱,發佈,經過一個單例總管。對象

內部設有一個字典和集合,保管引起實例和引起事件。blog

簡單的畫了個圖事件

 

幾處比較有意思的代碼ip

字典保存對象get

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

        }
    }

 

 

 

代碼下載

相關文章
相關標籤/搜索