首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过反射检索内部嵌套类的内部成员

通过反射检索内部嵌套类的内部成员
EN

Stack Overflow用户
提问于 2012-06-01 13:51:44
回答 2查看 3.1K关注 0票数 2

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

给定一个MenuItem,我想检索与成员onDrawItem对应的对象。但是我所要做的就是得到FieldInfo,而不是对象本身。

这是我的代码:

代码语言:javascript
复制
            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)

当到达最后一行时,我遇到了一个错误,说了这样的话(这很令人反感):

字段'onDrawItem‘défined in type 'System.Windows.Forms.MenuItem+MenuItemData’不是“System.Windows.Forms.MenuItem”类型目标对象的字段

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

----EDIT----

我的目标是删除-- menuItem的基本eventHandler,名为DrawItem。请参阅这个职位和函数RemoveClickEvent中的公认答案,以获得更好的理解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-01 14:07:16

代码语言:javascript
复制
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实例的引用。为此,您需要通过GetValue获取MenuItem实例中的data字段的值,并使用该值。

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2012-06-01 14:23:50

onDrawItem应该是一个事件,特别是考虑到对其声明类型的注释。我在MSDN上找到了这个页面,它应该可以帮助您。

代码语言:javascript
复制
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)

这是对你最有用的最后一点。获取链接到事件的方法的方法信息,然后您可以使用该方法启动方法,或者链接到该方法。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10851565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档