我很担心你会使用哪种方案。
如果您的程序集中包含一些公共和私有(或内部)类型,则只能从外部使用公共类型。任何内部或私人的类型都不应该是可用的,事实上,它们的存在不应该被发现。
因此,在我看来,GetTypes
和GetExportedTypes
应该返回相同的内容。
显然我在想这个错误 - 每个人都有什么用?
谢谢!
答案 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