1

好的,感谢ILSpy,我知道MenuItem类包含一个名为MenuItemData的内部类,它本身包含一个名为onDrawItem的内部成员。

给定一个 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)

到达最后一行时,我收到一条错误消息(被引用):

在“System.Windows.Forms.MenuItem+MenuItemData”类型中定义的字段“onDrawItem”不是“System.Windows.Forms.MenuItem”类型的目标对象的字段

我不知道在最后一行将什么对象传递给 GetValue 函数。有什么线索吗?

- - 编辑 - -

我的目标是删除名为DrawItem的 menuItem 的基本 eventHandler 。请参阅此帖子和已RemoveClickEvent接受答案中的功能以获得更好的理解。

4

2 回答 2

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

加法:要获得值,您需要引用 a 的实例MenuItemData。为此,您需要通过实例GetValue中的data字段获取值MenuItem并使用它。

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-01T14:07:16.983 回答
0

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)

最后一点应该对你最有用。获取链接到事件的方法的方法信息,然后您可以使用它来触发方法或链接到它。

更新 此页面也可能有所帮助。

于 2012-06-01T14:23:50.770 回答