You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找继承自BaseClass的类型?C#反射实现咨询

如何用C#反射查找所有继承自基类的类型

嘿,这事儿我熟!你已经定义了基类BaseClass和子类ChildClass,要通过反射找出所有继承自BaseClass的类型,其实用Assembly和反射API就能轻松搞定,我给你一步步说清楚:

核心思路

要实现这个需求,关键两步:

  1. 拿到包含目标类型的程序集(Assembly)
  2. 遍历程序集里的所有类型,筛选出符合继承关系的类

具体实现代码

首先要引用必要的命名空间:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

然后写一个通用方法来获取所有派生类型:

public static IEnumerable<Type> GetAllDerivedTypes(Type baseType)
{
    // 先获取包含基类的程序集,这样能精准扫描相关类型
    Assembly targetAssembly = baseType.Assembly;
    
    // 筛选符合条件的类型
    return targetAssembly.GetTypes()
        .Where(type => 
            type.IsClass // 只考虑类类型,排除接口、结构体等
            && !type.IsAbstract // 可选:如果不需要抽象子类,可以加上这行
            && type != baseType // 排除基类本身
            && baseType.IsAssignableFrom(type)); // 判断是否继承自基类(包括间接继承)
}

调用示例

现在你可以这样调用这个方法来找到所有BaseClass的子类:

// 获取所有继承自BaseClass的类型
var derivedTypes = GetAllDerivedTypes(typeof(BaseClass));

// 遍历输出结果
foreach (var type in derivedTypes)
{
    Console.WriteLine($"找到子类:{type.FullName}");
}

额外注意事项

  • 扫描多个程序集:如果你的子类分散在不同的程序集里(比如多个类库项目),可以用AppDomain.CurrentDomain.GetAssemblies()获取当前加载的所有程序集,然后逐个扫描。不过要注意,有些程序集可能还没被加载,这时候需要手动加载或者调整扫描逻辑。
  • 直接继承vs间接继承:上面的代码用IsAssignableFrom会包含所有间接继承的子类(比如GrandChildClass : ChildClass也会被找到)。如果只需要找直接继承的子类,把判断条件改成type.BaseType == baseType就行。
  • 性能考量:反射操作相对耗时,如果需要频繁调用,建议把结果缓存起来,避免重复扫描程序集。

内容的提问来源于stack exchange,提问作者Bizio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:18:34