首页 > 后端开发 > C++ > 如何使用反射有效地查找给定类型的所有派生类型?

如何使用反射有效地查找给定类型的所有派生类型?

Mary-Kate Olsen
发布: 2025-01-03 18:36:39
原创
867 人浏览过

How Can I Efficiently Find All Derived Types of a Given Type Using Reflection?

查找类型的派生类型

在许多情况下,有必要确定给定类型的派生类型。但是,默认方法(例如迭代加载的程序集中的所有类型并检查其可分配性)可能效率低下。

使用反射

更高效的解决方案涉及使用反射来检索派生类型。这是一种基于 LINQ 的方法:

var listOfDerivedTypes = (
    from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
    from assemblyType in domainAssembly.GetTypes()
    where type.IsAssignableFrom(assemblyType)
    select assemblyType).ToArray();
登录后复制

此方法迭代所有程序集并检查给定类型是否可分配给每个程序集类型。

Fluent 版本

为了提高可读性,您可以使用 Fluent版本:

var listOfDerivedTypes = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(domainAssembly => domainAssembly.GetTypes())
    .Where(assemblyType => type.IsAssignableFrom(assemblyType))
    .ToArray();
登录后复制

注意事项

  • 反射开销:每次调用反射方法都会产生开销。对于重复操作,请考虑加载类型一次并使用缓存机制,例如 Lazy。
  • 导出类型: 要仅检索公开可见的类型,请考虑使用 domainAssembly.GetExportedTypes() 而不是domainAssembly.GetTypes().
  • 基本类型包含: 默认情况下,返回的列表将包含基本类型。要排除它,请使用以下附加条件: && assemblyType != typeof(baseType).
  • 抽象类: 如果您只需要具体的派生类,请添加条件:&& ! assemblyType。 IsAbstract.
  • 泛型类型:处理泛型类型需要特定的技术,这不在本次回复中。请参阅提供的链接以获取更多信息。

以上是如何使用反射有效地查找给定类型的所有派生类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板