好的,感谢ILSpy,我知道MenuItem类包含一个名为MenuItemData的内部类,它本身包含一个内部成员,名为onDrawItemE 210。
给定一个MenuItem,我想检索与成员onDrawItem对应的对象。但是我所要做的就是得到FieldInfo,而不是对象本身。
这是我的代码:
Dim obj As Object
Dim fi As FieldInfo
Dim item as System.Windows.Forms.MenuItem
Dim mType As System.Type
mType = item.GetType()
mType = mType.GetMember("MenuItemData", BindingFlags.NonPublic)(0)
fi = mType.GetField("onDrawItem", BindingFlags.Static Or BindingFlags.Instance Or BindingFlags.NonPublic)
obj = fi.GetValue(item)当到达最后一行时,我遇到了一个错误,说了这样的话(这很令人反感):
字段'onDrawItem‘défined in type 'System.Windows.Forms.MenuItem+MenuItemData’不是“System.Windows.Forms.MenuItem”类型目标对象的字段
我不知道在最后一行传递给GetValue函数的对象是什么。有线索吗?
----EDIT----
我的目标是删除-- menuItem的基本eventHandler,名为DrawItem。请参阅这个职位和函数RemoveClickEvent中的公认答案,以获得更好的理解。
发布于 2012-06-01 14:07:16
System.Type menuItemType = typeof(System.Windows.Forms.MenuItem);
System.Type menuItemDataType = menuItemType.GetNestedType("MenuItemData",
System.Reflection.BindingFlags.NonPublic);
System.Reflection.FieldInfo fieldInfoOnDrawItem= menuItemDataType.GetField("onDrawItem",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.GetField ); 附加:要获得值,您需要一个对MenuItemData实例的引用。为此,您需要通过GetValue获取MenuItem实例中的data字段的值,并使用该值。
System.Windows.Forms.MenuItem menuItem = new System.Windows.Forms.MenuItem();
System.Reflection.FieldInfo fieldInfoData = menuItemType.GetField("data",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.GetField);
object dataField = fieldInfoData.GetValue(menuItem);
object onDrawItem = fieldInfoOnDrawItem.GetValue(dataField);发布于 2012-06-01 14:23:50
onDrawItem应该是一个事件,特别是考虑到对其声明类型的注释。我在MSDN上找到了这个页面,它应该可以帮助您。
Dim tExForm As Type = assem.GetType("ExampleForm")
Dim exFormAsObj As Object = Activator.CreateInstance(tExForm)
Dim evClick As EventInfo = tExForm.GetEvent("Click")
Dim tDelegate As Type = evClick.EventHandlerType
Dim miHandler As MethodInfo = GetType(Example).GetMethod("LuckyHandler", BindingFlags.NonPublic Or BindingFlags.Instance)这是对你最有用的最后一点。获取链接到事件的方法的方法信息,然后您可以使用该方法启动方法,或者链接到该方法。
更新此页面也可能有所帮助。
https://stackoverflow.com/questions/10851565
复制相似问题