如何使用反射访问内部类

Posted

技术标签:

【中文标题】如何使用反射访问内部类【英文标题】:How to access internal class using Reflection 【发布时间】:2010-11-18 13:20:40 【问题描述】:

如何访问程序集的内部类? 假设我想访问 System.ComponentModel.Design.DesignerHost。这里的 DesignerHost 是一个内部的密封类。

如何编写代码来加载程序集和类型?

【问题讨论】:

【参考方案1】:

通常,您不应该这样做 - 如果一个类型被标记为内部,这意味着您不打算从程序集外部使用它。它可以在以后的版本中删除、更改等。

但是,反射确实允许您访问不公开的类型和成员 - 只需查找采用 BindingFlags 参数的重载,并在您传递的标志中包含 BindingFlags.NonPublic .

如果您有类型的完全限定名称(包括程序集信息),那么只需调用Type.GetType(string) 即可。如果您事先知道程序集,并且知道该程序集中的公共类型,那么使用typeof(TheOtherType).Assembly 获取程序集引用通常更简单,那么您可以调用Assembly.GetType(string)

【讨论】:

@dattebayo :为了完成 Jon 的回答,请注意您的代码需要在完全信任的情况下运行,否则对非公共成员的反思将失败 有时你不得不这样做,直到它坏掉。我有一个 WPF DataGrid 命令,其参数为 SelectedItems。在命令中,参数以object 的形式接收,但它的类型为SelectedCellCollection,在我的代码中无法访问。我需要这种作弊方法,希望将object 参数转换为SelectedCellCollection【参考方案2】:

要加载您在示例中引用的程序集和类型:

Assembly design = Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll");
Type designHost = design.GetType("System.ComponentModel.Design.DesignerHost");

【讨论】:

你可以Assembly.Load("System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") 如果您只需要一种类型,您可以跳过显式加载程序集:var designHost = Type.GetType("System.ComponentModel.Design.DesignerHost, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

以上是关于如何使用反射访问内部类的主要内容,如果未能解决你的问题,请参考以下文章

C# - 快速观察中的“可读”内部属性​​但不使用反射?

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

如何使用反射访问安全元素

如何限制开发人员使用反射访问Java中的私有方法和构造函数?

Java反射之调用内部类

错误记录反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )