c# - 通过反射检索内部嵌套类的内部成员

标签 c# vb.net winforms reflection internal

好的,感谢ILSpy ,我知道 MenuItem 类包含一个名为 MenuItemDatainternal 类,该类本身包含一个名为 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/

相关文章:

c# - 将动态列表转换为数据表 c#

vb.net - 如何确定启动应用程序时是否按下了 SHIFT 或 CTRL 键

c# - 使用户控件显示在窗体边界之外

c# - 在 VisulaStudio 2017 上创建和编辑 ASP.net Web 表单项目

c# - Linq 连接与不同

vb.net - 自定义控件中的文本属性丢失值

.net - 是什么原因导致 .NET ToolTip 无法再次工作?

c# - 如何对 ToolStripDropDownButton 的 DropDownMenu 上的鼠标滚轮使用react?

.net - 如何获得 (.net) 表单将恢复到的状态?

c# - 如何从我的 Windows Phone 8 应用程序(XAML 和 C#)访问相机并将拍摄的照片保存在确定的文件夹中?