C# 如何获取任何事件的调用列表

C# 如何获取任何事件的调用列表,c#,.net,wpf,reflection,.net-4.0,C#,.net,Wpf,Reflection,.net 4.0,如何在WPF中获取控件的委托列表窗体事件 我尝试了以下代码,但它将返回字段信息为null TextBox cont = new TextBox(); cont.TextChanged += new TextChangedEventHandler(cont_TextChanged); FieldInfo fi = cont.GetType().GetField("TextChanged", BindingFlags.NonPublic | BindingFlags.Instance | Bindi

如何在WPF中获取控件的委托列表窗体事件

我尝试了以下代码,但它将返回字段信息为null

TextBox cont = new TextBox();
cont.TextChanged += new TextChangedEventHandler(cont_TextChanged);
FieldInfo fi = cont.GetType().GetField("TextChanged", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static);
Delegate del = (Delegate)fi.GetValue(cont);

我不知道为什么人们说这是不可能的:

假设要禁用任何临时事件,可以创建如下方法:

static Delegate[] DisableEvents(this Control ctrl, string eventName)
{
        PropertyInfo propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
        EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList;
        FieldInfo fieldInfo = typeof(Control).GetField("Event"+eventName, BindingFlags.NonPublic | BindingFlags.Static);

        object eventKey = fieldInfo.GetValue(ctrl);
        var eventHandler = eventHandlerList[eventKey] as Delegate;
        Delegate[] invocationList = eventHandler.GetInvocationList();
        foreach (EventHandler item in invocationList)
        {
            ctrl.GetType().GetEvent(eventName).RemoveEventHandler(ctrl, item);
        }
        return invocationList;

}|
var events = textbox1.DisableEvents("GotFocus")
你可以这样称呼它:

static Delegate[] DisableEvents(this Control ctrl, string eventName)
{
        PropertyInfo propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
        EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList;
        FieldInfo fieldInfo = typeof(Control).GetField("Event"+eventName, BindingFlags.NonPublic | BindingFlags.Static);

        object eventKey = fieldInfo.GetValue(ctrl);
        var eventHandler = eventHandlerList[eventKey] as Delegate;
        Delegate[] invocationList = eventHandler.GetInvocationList();
        foreach (EventHandler item in invocationList)
        {
            ctrl.GetType().GetEvent(eventName).RemoveEventHandler(ctrl, item);
        }
        return invocationList;

}|
var events = textbox1.DisableEvents("GotFocus")

如果您想再次添加它们,只需浏览事件列表。

前面的答案中描述的方法非常有效。 但是,要使用它,您需要确保事件不是作为字段实现的,而是作为属性实现的。同时,对委托的引用存储在Dictionary类的内部对象中。
您可以在此处阅读更多内容:

可能重复您在最后一句话“只需浏览事件列表”中的意思?我的意思是,您可以迭代在DisableEvents方法中获得的列表,然后再次添加这些事件。但实际上现在有一个最简单的方法可以做到这一点,那就是调用GetInvocationList来检索所有的委托。对我来说很有用!使用简单控件进行测试。单击事件+1这不是一种通用方法,它仅适用于Windows.Form.Controls(但这正是OP想要的)