如何使用反射访问内部类


74

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

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

Answers:


114

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

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

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


10
@dattebayo:仅需完成Jon的回答,请注意您的代码需要完全信任运行,否则对非公共成员的反思将失败
Thomas Levesque 2009年

3
有时您只需要直到它崩溃即可。我有一个WPFDataGrid命令,其参数为SelectedItems。在命令中,该参数的接收object类型为,但是类型为SelectedCellCollection,在我的代码中无法访问。我需要这种作弊方法,以期将object参数转换为SelectedCellCollection
ProfK

15

要加载程序集并键入您在示例中引用的内容:

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

11
您可以Assembly.Load("System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
abatishchev 2011年

6
如果只需要一种类型,则可以显式跳过程序集的加载:var designHost = Type.GetType("System.ComponentModel.Design.DesignerHost, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
Max Truxa 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.