using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; /// /// 消息发布订阅(非线程安全) /// public class Messenger { public static Messenger Defalut = new Messenger(); //支持重复key的字典 Dictionary> cache = new Dictionary>(); private Messenger() { } public void Sub(string key, Action act) { if (!cache.ContainsKey(key)) cache.Add(key, new List()); cache[key].Add(act); } public void UnSub(string key, Action act) { if (cache.ContainsKey(key)) { var items = cache[key].Skip(0).ToList(); foreach (var item in items) { if (item is Action actExist) { cache[key].Remove(actExist); } } } } public void Pub(string key, T data) { if (cache.TryGetValue(key, out List list)) { foreach (var item in list) { if (item is Action act) { act?.Invoke(data); } } } } }