获取一个types的所有派生types

有没有更好的(更高性能或更好的代码;)方法来查找所有派生types的types? 目前即时通讯使用类似于:

  1. 获取使用的组件中的所有types
  2. 检查我的types与所有这些types,如果它是'IsAssignable'

我想知道是否有更好的办法待办事项?

我曾经使用这个Linq方法来获取从基typesBinheritance的所有types:

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

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

  • 如上所述的链接状态,这个方法在每个调用中使用Reflection。 所以当重复使用同一types的方法时,可以通过加载一次来使效率更高。
  • 正如Anton所build议的那样,也许你可以(微)使用domainAssembly.GetExportedTypes()来优化它,只检索公开可见的types(如果这就是你所需要的)。
  • 正如Noldorin提到的, Type.IsAssignable也会得到原始的(非派生的)types。 ( Type.IsSubclassOf不会,但是如果基types是接口,则Type.IsSubclassOf将不起作用)。
  • 人们可能需要/需要检查一个“真正的”类: && ! assemblyType.IsAbstract && ! assemblyType.IsAbstract 。 (请注意,所有接口都被认为是抽象的,请参阅MSDN 。)

我很确定你所build议的方法将会是find所有派生types的更简单的方法。 父类不存储任何有关其子类的信息(如果他们这样做会很愚蠢),这意味着在这里没有避免search所有types。

唯一的build议是使用Type.IsSubclassOf方法而不是Type.IsAssignable来检查特定types是否从另一个派生。 不过,也许有一个原因需要使用Type.IsAssignable (例如,它与接口一起工作)。

唯一的优化,你可以挤出这是使用Assembly.GetExportedTypes()检索只公开可见的types,如果是这样的话。 除此之外,没有办法加快速度。 LINQ可能有助于可读性方面,但不是性能方面。

你可以做一些短路,以避免不必要的调用IsAssignableFrom ,这是根据Reflector,相当昂贵的一个,首先testing是否有问题的types是必需的“类”。 也就是说,你只是在寻找类,没有必要为枚举或数组testing“可赋值性”。

我认为没有更好的或直接的方法。

更好:使用IsSubclassOf而不是IsAssignable

Asuming baseType包含一个你想要检查的System.Type对象,matchType包含一个System.Type对象和你当前迭代的types(通过foreach-loop或者其他):

如果你想检查wheather,matchType是从我使用的baseType代表的类派生的

 matchType.IsSubclassOf(baseType) 

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

 matchType.GetInterface(baseType.ToString(), false) != null 

当然,我会把baseType.ToString()作为一个全局variables来存储,所以我不需要一直调用它。 而且,由于您可能需要在有许多types的上下文中使用,您还可以考虑使用System.Threading.Tasks.Parallel.ForEach-Loop遍历所有types。

如果你只是在浏览感兴趣,那么.NETreflection器有能力做到这一点。 但是,这不是真的可行的。 你想要在当前加载的程序集中的所有types? 执行程序集引用的程序集? 有很多种不同的方式来获取types列表,写一些可以解释(并提供选项)的东西将是一个相当大的成本,而且效益相对较低。

你想做什么? 有可能有更好的(或至less更有效的)方法来实现它。