IpsMessenger.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. namespace Ips.Library.Basic
  8. {
  9. /// <summary>
  10. /// 消息发布订阅(非线程安全)
  11. /// </summary>
  12. public class IpsMessenger
  13. {
  14. public static IpsMessenger Default = new IpsMessenger();
  15. //支持重复key的字典
  16. Dictionary<string, List<dynamic>> cache = new Dictionary<string, List<dynamic>>();
  17. private IpsMessenger()
  18. {
  19. }
  20. public void Sub<T>(string key, Action<T> act)
  21. {
  22. if (!cache.ContainsKey(key))
  23. cache.Add(key, new List<dynamic>());
  24. cache[key].Add(act);
  25. }
  26. public void UnSub<T>(string key, Action<T> act)
  27. {
  28. if (cache.ContainsKey(key))
  29. {
  30. var items = cache[key].Skip(0).ToList();
  31. foreach (var item in items)
  32. {
  33. if (item is Action<T> actExist)
  34. {
  35. cache[key].Remove(actExist);
  36. }
  37. }
  38. }
  39. }
  40. public void Pub<T>(string key, T data)
  41. {
  42. if (cache.TryGetValue(key, out List<dynamic> list))
  43. {
  44. foreach (var item in list)
  45. {
  46. if (item is Action<T> act)
  47. {
  48. act?.Invoke(data);
  49. }
  50. }
  51. }
  52. }
  53. }
  54. }