Messenger.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Reflection;
  7. /// <summary>
  8. /// 消息发布订阅(非线程安全)
  9. /// </summary>
  10. public class Messenger
  11. {
  12. public static Messenger Defalut = new Messenger();
  13. //支持重复key的字典
  14. Dictionary<string, List<dynamic>> cache = new Dictionary<string, List<dynamic>>();
  15. private Messenger()
  16. {
  17. }
  18. public void Sub<T>(string key, Action<T> act)
  19. {
  20. if (!cache.ContainsKey(key))
  21. cache.Add(key, new List<dynamic>());
  22. cache[key].Add(act);
  23. }
  24. public void UnSub<T>(string key, Action<T> act)
  25. {
  26. if (cache.ContainsKey(key))
  27. {
  28. var items = cache[key].Skip(0).ToList();
  29. foreach (var item in items)
  30. {
  31. if (item is Action<T> actExist)
  32. {
  33. cache[key].Remove(actExist);
  34. }
  35. }
  36. }
  37. }
  38. public void Pub<T>(string key, T data)
  39. {
  40. if (cache.TryGetValue(key, out List<dynamic> list))
  41. {
  42. foreach (var item in list)
  43. {
  44. if (item is Action<T> act)
  45. {
  46. act?.Invoke(data);
  47. }
  48. }
  49. }
  50. }
  51. }