好的,感谢ILSpy ,我知道 MenuItem 类包含一个名为 MenuItemData 的 internal 类,该类本身包含一个名为 internal 成员强>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)
到达最后一行时,我收到一条错误消息(已被翻译):
The field 'onDrawItem' défined in type 'System.Windows.Forms.MenuItem+MenuItemData' is not a field of the target object of type 'System.Windows.Forms.MenuItem
我不知道最后一行将什么对象传递给 GetValue 函数。有什么线索吗?
----编辑----
我的目标是删除名为DrawItem的menuItem的基本事件处理程序。请参阅this post以及已接受答案中的函数 RemoveClickEvent
,以便更好地理解。
最佳答案
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);
关于c# - 通过反射检索内部嵌套类的内部成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10851565/