组装.GetTypes——如果getexporttedtypes可用,为什么要使用这个?
本文关键字:如果 GetTypes getexporttedtypes 可用 组装 为什么 | 更新日期: 2023-09-27 18:11:02
我不知道在什么情况下你会使用一个或另一个。
如果你有一个程序集,其中有一些公共和私有(或内部)类型,那么只有公共类型可以从外部访问。任何内部类型或私有类型都不应该可用,实际上,它们的存在不应该被发现。
因此,GetTypes
和GetExportedTypes
-在我看来,应该返回相同的东西。
很明显我想错了——每个都是干什么用的?
谢谢!
来自MSDN文档:
组装。GetTypes 方法
返回值类型:系统。类型[]
包含所有在此程序集中定义的类型的数组。
来自MSDN文档:
组装。GetExportedTypes 方法
返回值
类型:系统。类型[]
一个数组,表示在此程序集中定义的类型,这些类型在程序集之外可见。
所以GetTypes()
调用确实会给你在程序集中定义的所有类型-无论它们是否"可见"和可实例化。可能看起来很奇怪—但是如果您想检查您自己、您自己的程序集(或与您的代码在同一名称空间中的程序集),该怎么办呢?你需要能够看到所有的东西——如果需要的话。
语言级别的可见性与反射级别的类型可见性无关。
反射的整个思想是你可以看到所有类型、成员等并检查它们;比如代码生成之类的。同样,您还会遇到使用InternalsVisibleToAttribute
的场景,以及需要反映您自己的程序集的场景。这些都是完全合法的,如果不可用,就不可能(因此严重限制了。net框架)。
GetExportedTypes()
不包括受保护/私有类型。GetTypes()
包含所有类型
关于internal
类型,GetExportedTypes()
的MSDN文档是不清楚的。
我正在调查一个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;
}
对于外部程序集确实是这样,但是如果在自己的程序集上调用GetTypes会怎样呢?
然后你也会看到私有的和内部的,这是合乎逻辑的。
如果你想要所有的公共类型,你可以使用getexporttedtypes,但是如果你也想要所有其他类型,你可以使用GetTypes。即使一个类型是私有的或内部的,你也可以创建新的实例,并通过反射和动态来使用它,所以我不认为这两个是多余的。