如何使用Reflection访问内部类

dat*_*ayo 64 c# reflection class internal

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

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

Jon*_*eet 99

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

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

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

  • @dattebayo:只是为了完成Jon的回答,请注意您的代码需要完全信任,或者对非公共成员的反思会失败 (8认同)
  • 有时您只需要直到它崩溃即可。我有一个WPF的DataGrid命令,其参数为SelectedItems。在命令中,该参数作为“对象”被接收,但是它的类型为“ SelectedCellCollection”,这在我的代码中是不可访问的。我需要这种作弊手段,以期将object参数转换为SelectedCellCollection。 (2认同)

Pat*_*ald 14

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

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

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