2012-06-01 164 views
0

好,感谢ILSpy,我知道菜单项类包含一个名为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) 

当到达最后一行,我得到一个错误说类似的东西(它traduced):

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

我不知道通过什么对象为t他在最后一行GetValue函数。任何线索?

---- ----编辑

我的目标是删除的菜单项的基础事件处理程序,命名为DRAWITEM。请参阅this post以及函数RemoveClickEvent中已公认的答案以便更好地理解。

+0

这不是C#,这是Visual Basic中。它仍然是视觉工作室,但标签是错误的。 – Nevyn

+0

我添加了C#标签,以便如果某人在C#中有答案,他可以添加它 – GianT971

回答

1
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实例的参考值。为此,您需要通过MenuItem实例中的data字段的GetValue获取该值,并使用该值。

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

onDrawItem在MenuItemData中的定义类似于:内部DrawItemEventHandler onDrawItem; – GianT971

+0

您错过了GetField绑定标志,而mType可能不是正确的嵌套类。我更新了答案 – MaLio

+0

我添加了GetField绑定标志,并且出现相同的错误。顺便说一句,我已经设法检索onDrawItem对应的fieldInfo。我需要的是传递给fi.GetValue的正确参数 – GianT971

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) 

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

更新This page might also help.

+0

我编辑了我的问题,请参阅底部的编辑部分 – GianT971