获取类型的所有派生类型

Blu*_*nce 56 .net c#

是否有更好的(更高性能或更好的代码;)方法来查找类型的所有派生类型?目前即时使用以下内容:

  1. 获取所用类型的所有类型
  2. 如果是'IsAssignable',请检查所有类型的类型

我想知道是否有更好的方式来做这件事?

Yah*_*ous 64

曾经使用这个Linq方法来获取从基类型B继承的所有类型:

    var listOfBs = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
                    from assemblyType in domainAssembly.GetTypes()
                    where typeof(B).IsAssignableFrom(assemblyType)
                    select assemblyType).ToArray();
Run Code Online (Sandbox Code Playgroud)

编辑:由于这似乎仍然得到更多的代表(因此更多的观点),让我添加一些更多的细节:

  • 如上述链接所述,此方法在每次调用时都使用Reflection.因此,当对同一类型重复使用该方法时,可以通过加载一次来使其更有效.
  • 正如安东所说,也许你可以(微观)优化它domainAssembly.GetExportedTypes() ,只检索公开可见的类型(如果这就是你需要的).
  • 正如Noldorin所提到的,Type.IsAssignable也将获得原始(非衍生)类型.(Type.IsSubclassOf不会,但Type.IsSubclassOf 如果基类型是接口则不起作用).
  • 人们可能想要/需要检查"真正的"课程:&& ! assemblyType.IsAbstract.(请注意,所有接口都被视为抽象,请参阅MSDN.)

  • 出于某种原因(我没有深入研究细节)`domainAssembly.GetExportedTypes()`无法从动态程序集中调用.(在我的例子中,我创建了一个用`.GetDerivedTypes()方法扩展`Type`类的类,我从MVC Controller动作调用它.) (2认同)

Nol*_*rin 10

我很确定你建议的方法将是查找所有派生类型的更简单方法.父类不存储关于它们的子类是什么的任何信息(如果他们这样做,那将是非常愚蠢的),这意味着没有避免在这里搜索所有类型.

仅建议使用该Type.IsSubclassOf方法而不是Type.IsAssignable检查特定类型是否来自另一个.不过,也许你需要使用Type.IsAssignable它(例如,它适用于接口).

  • 注意:如果"基类"实际上是一个接口,IsSubclassOf不起作用,而IsAssignableFrom则是. (3认同)

Ant*_*lev 7

您可以挤出的唯一优化是,Assembly.GetExportedTypes()如果是这种情况,则仅用于检索公开可见的类型.除此之外,没有办法加快速度.LINQ可能有助于提高可读性,但不提供性能方面的帮助.

你可以做一些短路,以避免不必要的调用IsAssignableFrom,根据Reflector,这是非常昂贵的,首先测试所讨论的类型是否是必需的"类".也就是说,你只是在搜索类,对于"可赋值性"测试枚举或数组是没有意义的.


小智 5

假设 baseType 包含一个您要检查的 System.Type 对象,并且 matchType 包含一个具有当前迭代类型的 System.Type 对象(通过 foreach 循环或其他方式):

如果你想检查 matchType 是否是从 baseType 表示的类派生的,我会使用

matchType.IsSubclassOf(baseType)
Run Code Online (Sandbox Code Playgroud)

如果你想检查 matchType 是否实现了由 baseType 表示的接口,我会使用

matchType.GetInterface(baseType.ToString(), false) != null
Run Code Online (Sandbox Code Playgroud)

当然,我会将 baseType.ToString() 存储为全局变量,这样我就不需要一直调用它。由于您可能需要在有很多类型的上下文中使用它,因此您还可以考虑使用 System.Threading.Tasks.Parallel.ForEach-Loop 来迭代所有类型...