Assembly.GetTypes - 如果GetExportedTypes可用,为什么要使用它?

Coo*_*ick 8 c# .net-assembly

我对你会使用哪种方案感到困惑.

如果您的程序集中包含一些公共和私有(或内部)类型,则只能从外部使用公共类型.任何内部或私人的类型都不应该可用,事实上,它们的存在不应该是可发现的.

因此,GetTypesGetExportedTypes-在我的脑海里,应该返回同样的事情.

显然我在想这个错误 - 每个人都有什么用?

谢谢!

mar*_*c_s 7

来自MSDN文档:

Assembly.GetTypes方法
返回值类型:System.Type []
包含此程序集中定义的所有类型的数组.

来自MSDN文档:

Assembly.GetExportedTypes方法
返回值
类型:System.Type []
一个数组,表示在程序集外部可见的此程序集中定义的类型.

因此,GetTypes()调用确实会为您提供程序集中定义的所有类型 - 无论它们是"可见的"还是可实例化的.可能看起来很奇怪 - 但如果您想检查自己,自己的程序集(或与代码位于同一命名空间的程序集)会怎么样?你需要能够看到一切 - 如果需要的话.


And*_*tan 4

语言级别的可见性与反射级别的类型可见性无关。

反射的整个想法是你可以看到所有类型、成员等并检查它们;比如说用于代码生成目的或其他目的。同样,您也会遇到这样的情况:InternalsVisibleToAttribute使用 的情况,以及正如其他人所说的,当您需要反映自己的程序集时。这些都是完全合法的,如果不可用的话,这些都是不可能的(从而严重限制 .Net 框架)。

因此,默认值应该是返回所有类型 - 仅当尝试在运行时使用类型时,可见性才会出现。也可以侧步;.Net框架本身依赖于一些能够实例化其他程序集自己的私​​有类型的场景;您也可以跳过对自己动态构建的程序集的可见性检查。我在为我们的内部应用程序编写的自定义 IOC 和 DI 框架上使用此功能,以允许我们的开发人员使类型完全对外部代码隐藏,但仍可在其应用程序中使用。