组装.GetTypes——如果getexporttedtypes可用,为什么要使用这个?

本文关键字:如果 GetTypes getexporttedtypes 可用 组装 为什么 | 更新日期: 2023-09-27 18:11:02

我不知道在什么情况下你会使用一个或另一个。

如果你有一个程序集,其中有一些公共和私有(或内部)类型,那么只有公共类型可以从外部访问。任何内部类型或私有类型都不应该可用,实际上,它们的存在不应该被发现。

因此,GetTypesGetExportedTypes -在我看来,应该返回相同的东西。

很明显我想错了——每个都是干什么用的?

谢谢!

组装.GetTypes——如果getexporttedtypes可用,为什么要使用这个?

来自MSDN文档:

组装。GetTypes 方法
返回值类型:系统。类型[]
包含所有在此程序集中定义的类型的数组。

来自MSDN文档:

组装。GetExportedTypes 方法
返回值
类型:系统。类型[]
一个数组,表示在此程序集中定义的类型,这些类型在程序集之外可见。

所以GetTypes()调用确实会给你在程序集中定义的所有类型-无论它们是否"可见"和可实例化。可能看起来很奇怪—但是如果您想检查您自己、您自己的程序集(或与您的代码在同一名称空间中的程序集),该怎么办呢?你需要能够看到所有的东西——如果需要的话。

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

反射的整个思想是你可以看到所有类型、成员等并检查它们;比如代码生成之类的。同样,您还会遇到使用InternalsVisibleToAttribute的场景,以及需要反映您自己的程序集的场景。这些都是完全合法的,如果不可用,就不可能(因此严重限制了。net框架)。

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

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。即使一个类型是私有的或内部的,你也可以创建新的实例,并通过反射和动态来使用它,所以我不认为这两个是多余的。