获取一个types的所有派生types
有没有更好的(更高性能或更好的代码;)方法来查找所有派生types的types? 目前即时通讯使用类似于:
- 获取使用的组件中的所有types
- 检查我的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更有效的)方法来实现它。