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);