GetField无法获取EventClick

时间:2017-05-01 10:42:24

标签: c# .net events reflection

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

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

 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[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,但这正是发生的事情

为什么会这样?什么可能出错?

这是我的确切代码

        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上,key是一个有效的对象。这似乎是.Net 4.5.2

中的特定错误

1 个答案:

答案 0 :(得分:1)

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

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

key提供有效对象