是否有更好的(更高性能或更好的代码;)方法来查找类型的所有派生类型?目前即时使用以下内容:
我想知道是否有更好的方式来做这件事?
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)
编辑:由于这似乎仍然得到更多的代表(因此更多的观点),让我添加一些更多的细节:
domainAssembly.GetExportedTypes()
,只检索公开可见的类型(如果这就是你需要的).Type.IsAssignable也将获得原始(非衍生)类型.(Type.IsSubclassOf不会,但Type.IsSubclassOf 如果基类型是接口则不起作用).&& ! assemblyType.IsAbstract.(请注意,所有接口都被视为抽象,请参阅MSDN.)Nol*_*rin 10
我很确定你建议的方法将是查找所有派生类型的更简单方法.父类不存储关于它们的子类是什么的任何信息(如果他们这样做,那将是非常愚蠢的),这意味着没有避免在这里搜索所有类型.
仅建议使用该Type.IsSubclassOf方法而不是Type.IsAssignable检查特定类型是否来自另一个.不过,也许你需要使用Type.IsAssignable它(例如,它适用于接口).
您可以挤出的唯一优化是,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 来迭代所有类型...
| 归档时间: |
|
| 查看次数: |
40679 次 |
| 最近记录: |