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

时间:2011-10-10 11:41:26

标签: c# .net-assembly

我很担心你会使用哪种方案。

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

因此,在我看来,GetTypesGetExportedTypes应该返回相同的内容。

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

谢谢!

6 个答案:

答案 0 :(得分:7)

来自MSDN docs

  

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

来自MSDN docs

  

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

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

答案 1 :(得分:4)

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

反思的整个想法是你可以看到所有类型,成员等并检查它们;说出代码生成目的或其他什么。同样地,您有一些方案,例如使用InternalsVisibleToAttribute的位置,以及其他人所说的,当您需要反映自己的装配时。如果不可用,这些都是完全合法的,并且不可能(因此严重限制.Net框架)。

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

答案 2 :(得分:0)

对于确实如此的外部装配,但是如果在自己的装配上调用GetTypes会怎么样?

然后你也会看到私人和内部的,这是合乎逻辑的。

答案 3 :(得分:0)

GetExportedTypes()不包含受保护/私有类型。 GetTypes()包括所有类型。

关于internal类型,GetExportedTypes()的MSDN文档不清楚。

答案 4 :(得分:0)

如果您想要所有公共类型,可以使用GetExportedTypes,但如果您也想要所有其他类型,则可以使用GetTypes。即使某个类型是私有或内部类型,您也可以通过Reflection和Dynamic创建新实例并使用它,因此我看不到这两个中的任何一个都是多余的。

答案 5 :(得分:0)

我正在调查遇到此问题的网络API bug,发现Assembly.GetExportedTypes和'Assembly.GetTypes`之间存在一个非常重要的区别。它在文档中,但不是很清楚。

如果无法加载任何依赖程序集,

Assembly.GetExportedTypes将抛出'FileNotFoundException'。 “Assembly.GetTypes throws {ReflectionTypeLoadException {1}} {GetTypes {1}} GetExportedTypes`。

这段代码不起作用,因为which contains types that are loaded successfully. So, if you want to succeed even if some of the types in the assembly cannot be loaded, you should use不会抛出and not

Assembly.GetExportedTypes