2012-06-01 62 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