一直很心水棱鏡(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) { } }