已知IA类型,如何获取C#类继承链中最底层类G的Type?
从IA类型获取最底层实现类G的解决方案
没问题,我来帮你搞定这个——从已知的IA类型出发,通过反射找到继承链最底层的G类型。先理清楚你的类结构,再一步步实现解决方案:
你的类继承/实现关系梳理
- 具体类
G继承自F F继承自封闭泛型类E<State>- 抽象泛型类
E<TState>继承自D<TState, StatusQueryParams>(附带TState的类型约束) - 抽象泛型类
D<TState, TQuery>继承自C<TState, TQuery> - 抽象泛型类
C<TState, TQuery>实现接口IA和IB - 接口
IA继承自IB
实现思路
因为我们只持有IA的Type对象,所以需要通过反射遍历程序集中的类型,筛选出符合条件的具体类,最终定位到没有派生类的最底层实现(也就是G):
- 扫描所有加载的程序集,找到所有实现了
IA的类型 - 过滤掉抽象类、接口、开放泛型定义(比如
E<TState>这种未指定泛型参数的类),只保留具体的可实例化类型 - 在剩余类型中,找到没有被其他任何类型继承的那个——这就是最底层的类
G
代码实现
using System; using System.Linq; using System.Reflection; public static class TypeFinder { public static Type GetBottommostImplementingType(Type targetInterface) { if (targetInterface == null || !targetInterface.IsInterface) throw new ArgumentException("参数必须是一个接口类型", nameof(targetInterface)); // 获取当前应用域中所有加载的程序集(如果目标类在外部程序集,可按需调整) var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); // 筛选符合条件的候选类型:实现了目标接口、非抽象、非接口、非开放泛型 var candidateTypes = loadedAssemblies .SelectMany(assembly => assembly.GetTypes()) .Where(type => targetInterface.IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface && !type.IsGenericTypeDefinition); // 找到没有派生类的类型(最底层) return candidateTypes.FirstOrDefault(type => !candidateTypes.Any(otherType => otherType != type && type.IsAssignableFrom(otherType))); } } // 使用示例 public class Program { public static void Main() { Type iaType = typeof(IA); Type bottommostType = TypeFinder.GetBottommostImplementingType(iaType); if (bottommostType != null) { Console.WriteLine($"找到的最底层类型是: {bottommostType.FullName}"); // 输出示例:YourNamespace.G } else { Console.WriteLine("未找到符合条件的最底层实现类"); } } }
关键代码解释
IsAssignableFrom: 用来判断一个类型是否可以被另一个类型赋值,这里用来检查类型是否实现/继承了IA- 过滤条件:确保我们只处理具体可实例化的类,排除抽象类、接口和未绑定泛型参数的泛型定义
- 最终筛选:通过检查是否有其他类型继承当前类型,确定它是否是继承链的最底端
注意事项
- 如果你的
G类在单独的程序集中,需要确保该程序集已经被加载到当前应用域中 - 如果存在多个不相关的最底层实现类(比如除了
G还有另一个类也实现IA且没有派生类),代码会返回第一个匹配的类型,你可以根据实际需求调整筛选逻辑
内容的提问来源于stack exchange,提问作者vini
相关产品推荐
相关产品推荐

