C#之清除已经注册的事件

private static void DealA(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine($"Exception A Catches it!");
}
private static void DealB(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine($"Exception B Catches it!");
}
 static Delegate[] GetEventHandlers(object instance,string eventName)
 {
     var type = instance.GetType();
     var eventField = type.GetField(eventName,BindingFlags.Instance|BindingFlags.NonPublic | BindingFlags.GetField);
     if (eventField != null)
     {
         eventField.SetValue(instance,null);
     }
     return null;
 }
   static void Main(string[] args)
   {
       AppDomain.CurrentDomain.UnhandledException += DealA;
       var a = GetEventHandlers(AppDomain.CurrentDomain, "_unhandledException");
       
       AppDomain.CurrentDomain.UnhandledException += DealB;
       Throw();
       Console.WriteLine();
}

获取点击事件注册列表:

 public static List<Delegate> GetClickEventHandlers(Button button)
 {
     List<Delegate> handlers = new List<Delegate>();
     // 获取 ClickEvent 的 RoutedEvent 对象
     var clickEvent = Button.ClickEvent;

     // 获取 Button 的 EventHandlersStore
     var eventHandlersStoreProperty = typeof(UIElement).GetProperty("EventHandlersStore", BindingFlags.Instance | BindingFlags.NonPublic);
     var eventHandlersStore = eventHandlersStoreProperty?.GetValue(button);

     if (eventHandlersStore != null)
     {
         // 获取 EventHandlersStore 中的 RoutedEventHandlers
         var getRoutedEventHandlersMethod = eventHandlersStore.GetType().GetMethod("GetRoutedEventHandlers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
         var routedEventHandlers = getRoutedEventHandlersMethod?.Invoke(eventHandlersStore, new object[] { clickEvent }) as Array;

         if (routedEventHandlers != null)
         {
             // 遍历 RoutedEventHandlers 并输出委托信息
             foreach (var handler in routedEventHandlers)
             {
                 var handlerInfo = handler.GetType().GetField("_handler", BindingFlags.Instance | BindingFlags.NonPublic);
                 var delegateInfo = handlerInfo?.GetValue(handler) as Delegate;

                 if (delegateInfo != null)
                 {
                     //Console.WriteLine($"Handler: {delegateInfo.Method.Name}");
                     handlers.Add(delegateInfo);
                 }
             }
         }
         else
         {
             //Console.WriteLine("未找到 Click 事件的订阅者。");
         }
     }
     else
     {
         //Console.WriteLine("无法访问 EventHandlersStore。");
     }
     return handlers;
 }
posted @ 2025-03-14 21:01  JohnYang819  阅读(42)  评论(0)    收藏  举报