DisposerEventManager.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Base;
  6. namespace Model
  7. {
  8. [Flags]
  9. public enum DisposerEventType
  10. {
  11. Awake = 1,
  12. Awake1 = 2,
  13. Awake2 = 4,
  14. Awake3 = 8,
  15. Update = 16,
  16. Load = 32,
  17. }
  18. public class DisposerTypeInfo
  19. {
  20. private readonly Dictionary<DisposerEventType, MethodInfo> infos = new Dictionary<DisposerEventType, MethodInfo>();
  21. public void Add(DisposerEventType type, MethodInfo methodInfo)
  22. {
  23. try
  24. {
  25. this.infos.Add(type, methodInfo);
  26. }
  27. catch (Exception e)
  28. {
  29. throw new Exception($"Add DisposerEventType MethodInfo Error: {type}", e);
  30. }
  31. }
  32. public MethodInfo Get(DisposerEventType type)
  33. {
  34. MethodInfo methodInfo;
  35. this.infos.TryGetValue(type, out methodInfo);
  36. return methodInfo;
  37. }
  38. public DisposerEventType[] GetDisposerEvent2Types()
  39. {
  40. return this.infos.Keys.ToArray();
  41. }
  42. }
  43. public sealed class DisposerEventManager
  44. {
  45. private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
  46. private readonly Dictionary<DisposerEventType, HashSet<Disposer>> disposers = new Dictionary<DisposerEventType, HashSet<Disposer>>();
  47. private Dictionary<Type, DisposerTypeInfo> eventInfo;
  48. public DisposerEventManager()
  49. {
  50. foreach (DisposerEventType t in Enum.GetValues(typeof(DisposerEventType)))
  51. {
  52. this.disposers.Add(t, new HashSet<Disposer>());
  53. }
  54. }
  55. public void Register(string name, Assembly assembly)
  56. {
  57. this.eventInfo = new Dictionary<Type, DisposerTypeInfo>();
  58. this.assemblies[name] = assembly;
  59. foreach (Assembly ass in this.assemblies.Values)
  60. {
  61. Type[] types = ass.GetTypes();
  62. foreach (Type type in types)
  63. {
  64. object[] attrs = type.GetCustomAttributes(typeof(DisposerEventAttribute), true);
  65. if (attrs.Length == 0)
  66. {
  67. continue;
  68. }
  69. DisposerEventAttribute DisposerEventAttribute = attrs[0] as DisposerEventAttribute;
  70. Type type2 = DisposerEventAttribute.ClassType;
  71. if (!this.eventInfo.ContainsKey(type2))
  72. {
  73. this.eventInfo.Add(type2, new DisposerTypeInfo());
  74. }
  75. foreach (MethodInfo methodInfo in type.GetMethods())
  76. {
  77. int n = methodInfo.GetParameters().Length;
  78. if (methodInfo.IsStatic)
  79. {
  80. --n;
  81. }
  82. string sn = n > 0? $"{methodInfo.Name}{n}" : methodInfo.Name;
  83. foreach (string s in Enum.GetNames(typeof(DisposerEventType)))
  84. {
  85. if (s != sn)
  86. {
  87. continue;
  88. }
  89. DisposerEventType t = EnumHelper.FromString<DisposerEventType>(s);
  90. this.eventInfo[type2].Add(t, methodInfo);
  91. break;
  92. }
  93. }
  94. }
  95. }
  96. this.Load();
  97. }
  98. public void Add(Disposer disposer)
  99. {
  100. DisposerTypeInfo disposerTypeInfo;
  101. if (!this.eventInfo.TryGetValue(disposer.GetType(), out disposerTypeInfo))
  102. {
  103. return;
  104. }
  105. foreach (DisposerEventType disposerEvent2Type in disposerTypeInfo.GetDisposerEvent2Types())
  106. {
  107. this.disposers[disposerEvent2Type].Add(disposer);
  108. }
  109. }
  110. public void Remove(Disposer disposer)
  111. {
  112. DisposerTypeInfo disposerTypeInfo;
  113. if (!this.eventInfo.TryGetValue(disposer.GetType(), out disposerTypeInfo))
  114. {
  115. return;
  116. }
  117. foreach (DisposerEventType disposerEvent2Type in disposerTypeInfo.GetDisposerEvent2Types())
  118. {
  119. this.disposers[disposerEvent2Type].Remove(disposer);
  120. }
  121. }
  122. public Assembly GetAssembly(string name)
  123. {
  124. return this.assemblies[name];
  125. }
  126. public Assembly[] GetAssemblies()
  127. {
  128. return this.assemblies.Values.ToArray();
  129. }
  130. private void Load()
  131. {
  132. HashSet<Disposer> list;
  133. if (!this.disposers.TryGetValue(DisposerEventType.Update, out list))
  134. {
  135. return;
  136. }
  137. foreach (Disposer disposer in list)
  138. {
  139. DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
  140. disposerTypeInfo.Get(DisposerEventType.Load).Run(disposer);
  141. }
  142. }
  143. public void Awake(Disposer disposer)
  144. {
  145. DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
  146. disposerTypeInfo.Get(DisposerEventType.Awake)?.Run(disposer);
  147. }
  148. public void Awake(Disposer disposer, object p1)
  149. {
  150. DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
  151. disposerTypeInfo.Get(DisposerEventType.Awake1)?.Run(disposer, p1);
  152. }
  153. public void Awake(Disposer disposer, object p1, object p2)
  154. {
  155. DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
  156. disposerTypeInfo.Get(DisposerEventType.Awake2)?.Run(disposer, p1, p2 );
  157. }
  158. public void Awake(Disposer disposer, object p1, object p2, object p3)
  159. {
  160. DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
  161. disposerTypeInfo.Get(DisposerEventType.Awake3)?.Run(disposer, p1, p2, p3 );
  162. }
  163. public void Update()
  164. {
  165. HashSet<Disposer> list;
  166. if (!this.disposers.TryGetValue(DisposerEventType.Update, out list))
  167. {
  168. return;
  169. }
  170. foreach (Disposer disposer in list)
  171. {
  172. DisposerTypeInfo disposerTypeInfo = this.eventInfo[disposer.GetType()];
  173. disposerTypeInfo.Get(DisposerEventType.Update).Run(disposer);
  174. }
  175. }
  176. }
  177. }