如果您有一个包含一些公共和私有(或内部)类型的程序集,那么只有公共类型应该在外部可用。任何内部或私有的类型都不应该可用,实际上它们的存在也不应被发现。
因此,在我看来,
GetTypes
和GetExportedTypes
应该返回相同的结果。显然,我的想法是错误的——每个方法的作用是什么?
谢谢!
GetTypes
和GetExportedTypes
应该返回相同的结果。语言层面上的可见性与反射层面上的类型可见性没有任何关系。
反射的整个概念是,您可以查看所有类型、成员等,并检查它们;例如用于代码生成目的或其他用途。同样,您还有一些场景,例如使用InternalsVisibleToAttribute
时以及需要反射自己的程序集时。如果这些不可用,就会大大限制.Net框架,而这些都是完全合法的。
因此,默认情况下应返回所有类型,只有在运行时企图使用类型时才会涉及到可见性。这也可以被绕过;.Net框架本身依赖于某些情况,可以实例化其他程序集的私有类型;并且您还可以跳过自己动态构建的程序集的可见性检查。我在为我们内部应用程序编写的自定义IOC和DI框架中使用此功能,以允许我们的开发人员将类型完全隐藏在外部代码之外,但仍然可以在其应用程序中使用。
我正在调查一个与 bug 相关的web API,并发现Assembly.GetExportedTypes
和'Assembly.GetTypes`之间有一个非常重要的区别。这在文档中有说明,但不是非常清楚。
Assembly.GetExportedTypes
如果无法加载任何依赖程序集,则会抛出“FileNotFoundException”异常。 Assembly.GetTypes
会抛出包含成功加载的类型的ReflectionTypeLoadException
。因此,如果即使无法加载程序集中的某些类型,您仍想成功,请使用GetTypes
而不是GetExportedTypes
。
这段代码将无法正常工作,因为Assembly.GetExportedTypes
不会抛出ReflectionTypeLoadException
。
Type[] types;
try
{
types = assembly.GetExportedTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types;
}
GetExportedTypes()
不包括受保护/私有类型。GetTypes()
包括所有类型。
关于 internal
类型,GetExportedTypes()
的 MSDN 文档不够清晰。
对于外部程序集,确实是这种情况,但如果您在自己的程序集上调用GetTypes呢?
那么您也会看到私有和内部的类型,这是合理的。