GetField无法获得EventClick [英] GetField unable to obtain EventClick

查看:38
本文介绍了GetField无法获得EventClick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试以表单的形式确定订阅 Click 事件的方法,并遵循指南

I am trying to determine the method that Click event is subscribed to, in my form, and I follow the guide here.

上面的论坛帖子可以通过以下代码获取Click事件订阅的列表

Whereas the forum post above able to get the list that the Click event is subscribing to by following code

 hasClickEventHandler = HasEventHandler(buttonControl, "EventClick");
    Assert.AreEqual(hasClickEventHandler, true);


    private bool HasEventHandler(Control control, string eventName)
    {
        EventHandlerList events =
            (EventHandlerList)
            typeof(Component)
             .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance)
             .GetValue(control, null);

        object key = typeof(Control)
            .GetField(eventName, BindingFlags.NonPublic | BindingFlags.Static)
            .GetValue(null);

        Delegate handlers = events[key];

        return handlers != null && handlers.GetInvocationList().Any();
    }

我不能.

然后我使用 var keys = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static); 进行检查,我发现其中一个Keys确实具有正确的事件姓名.即

I then use var keys = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static); to check, and I found that one of the Keys does seem to have the correct event name. ie,

keys[19].FullName=="System.Windows.Forms.Control.EventClick";
keys[19].Name=="EventClick";

所以没有理由

object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static)

还有

object key = typeof(Control).GetField("System.Windows.Forms.Control.EventClick", BindingFlags.NonPublic | BindingFlags.Static)

返回 null ,但这正是发生的情况

Returns null, and yet this is exactly what happen

为什么会这样?可能出了什么问题?

Why is this so? What could have gone wrong?

这是我的确切代码

        var form = new Form1();
        EventHandlerList events = (EventHandlerList)typeof(Control)
            .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance)
            .GetValue(form, null);
        var keys = typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static);
        var name = keys[19].Name;  //name="EventClick"
       object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);  //null

修改:我可以在.Net 4.5.2上重现该行为,但是,在.Net 4.6上,键是有效的对象.这似乎是.Net 4.5.2中的特定错误

I can reproduce the behavior on .Net 4.5.2, however, on .Net 4.6, key is a valid object. This seems to be a specific bug in .Net 4.5.2

推荐答案

我的解决方案:将目标从.Net 4.5.2更改为.Net 4.6可以解决此问题;在.Net 4.6中

My solution: Changing the target from .Net 4.5.2 to .Net 4.6 fixes the issue; in .Net 4.6

 object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);

提供有效的对象

这篇关于GetField无法获得EventClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆