Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetField无法获取EventClick_C#_.net_Events_Reflection - Fatal编程技术网

C# GetField无法获取EventClick

C# GetField无法获取EventClick,c#,.net,events,reflection,C#,.net,Events,Reflection,我正在尝试确定订阅Click事件的方法(在我的表单中),并遵循指南 然而,上面的论坛帖子能够通过以下代码获得点击事件订阅的列表 hasClickEventHandler = HasEventHandler(buttonControl, "EventClick"); Assert.AreEqual(hasClickEventHandler, true); private bool HasEventHandler(Control control, string eventNam

我正在尝试确定订阅
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)

返回
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
编辑:
我可以在.NET4.5.2上重现这种行为,但是在.NET4.6上,key是一个有效的对象。这似乎是.Net 4.5.2中的一个特定错误,我的解决方案是:将目标从.Net 4.5.2更改为.Net 4.6,解决了这个问题;在.NET4.6中

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

提供有效对象

hmmm。。。看起来应该行得通,indeed@MarcGravell,这是非常令人费解的,我已经附加了我的完整代码。如果你在索引[19]中找到EventClick back,那么你就有了一个非常不寻常的.NET版本。我不得不猜测.NET4.7,幸好它还没有安装在我的任何一台机器上,在该版本中有相当多的Winforms修补程序。否则,类似这样的代码的危险性就大了。使用一个合适的反编译器来挖掘一下。@HansPassant,你这边的事件点击通常在什么位置?在3.5和4.6.2上都是[17]。如果你告诉我们你用什么应该会容易些。
 object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);