c# - 如何获取任意事件的调用列表

标签 c# .net wpf reflection .net-4.0

如何在WPF中获取控件的委托(delegate)列表表单事件。

我试过下面的代码,但它会将字段信息返回为 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")

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

关于c# - 如何获取任意事件的调用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790068/

相关文章:

c# - Encoding.UTF8.GetBytes() 是否创建 BOM?

c# - MVC4 将消息从一个 Controller 传递到另一个 Controller

.net - 从 javascript 调用 vb.net 类函数

c# - 获取 Control.KeyDown 上的字符?

c# - 实时数据记录设计方法?

c# - 没有 NET 3.0 的 WCF

c# - 使用 MVVM 将矩形添加到 Canvas

c# - WPF 将 Window 模板中的按钮绑定(bind)到 ViewModel 的命令

wpf - 多点触控 ScrollViewer 吃触控事件

c# - 有没有办法在事先不知道对象结构的情况下从 JSON 组合匿名类型对象?