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;
}
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####

浙公网安备 33010602011771号