EventHandleHelper.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.Design;
  4. using System.Linq;
  5. using System.Text;
  6. namespace Veldrid.Common.Tools
  7. {
  8. public static class EventHandleHelper
  9. {
  10. public static void ClearEventHandle<T>(this T obj) where T : class
  11. {
  12. if (obj == null) return;
  13. var flag = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance;
  14. var eventinfos = obj.GetType().GetEvents(flag);
  15. if (eventinfos == null || eventinfos.Length == 0) return;
  16. foreach (var field in eventinfos.Select(x=>obj.GetType().GetFieldInfo(x.Name,flag)).Where(x=>x!=null))
  17. {
  18. if (field == null) return;
  19. object fieldvalue = field.GetValue(obj);
  20. var eventinfo = eventinfos.First(x => x.Name == field.Name);
  21. if(eventinfo.AddMethod.IsPublic)
  22. {
  23. if (fieldvalue is Delegate dele)
  24. {
  25. foreach (Delegate del in dele.GetInvocationList())
  26. {
  27. eventinfo.RemoveEventHandler(obj, del);
  28. }
  29. }
  30. }
  31. else
  32. {
  33. field.SetValue(obj, null);
  34. }
  35. }
  36. foreach(var member in GetMemberInfos(obj.GetType(),flag))
  37. {
  38. if(member is System.Reflection.FieldInfo fieldinfo)
  39. {
  40. fieldinfo.SetValue(obj, null);
  41. }
  42. if(member is System.Reflection.PropertyInfo propertyinfo)
  43. {
  44. propertyinfo.SetValue(obj, null);
  45. }
  46. }
  47. }
  48. private static System.Reflection.FieldInfo? GetFieldInfo(this Type objtype, string name, System.Reflection.BindingFlags flags)
  49. {
  50. if (objtype == null || objtype.GetEvents(flags).Length == 0) return null;
  51. var info = objtype.GetFields(flags).FirstOrDefault(x => x.Name == name);
  52. if (info == null && objtype.BaseType != null) return objtype.BaseType.GetFieldInfo(name, flags);
  53. else return info;
  54. }
  55. private static List<System.Reflection.MemberInfo> GetMemberInfos(this Type objtype, System.Reflection.BindingFlags flags)
  56. {
  57. if (objtype == null) return new List<System.Reflection.MemberInfo>();
  58. List<System.Reflection.MemberInfo> memberInfos = new List<System.Reflection.MemberInfo>();
  59. while (objtype != null)
  60. {
  61. memberInfos.AddRange(objtype.GetFields(flags).Where(x => x.FieldType != null && x.FieldType.BaseType == typeof(MulticastDelegate)));
  62. memberInfos.AddRange(objtype.GetProperties(flags).Where(x => x.PropertyType != null && x.PropertyType.BaseType == typeof(MulticastDelegate)));
  63. objtype = objtype.BaseType;
  64. }
  65. return memberInfos;
  66. }
  67. }
  68. }