使用IsAssignableTo识别开放泛型接口的问题排查
问题解决:获取实现开放泛型接口IService<,>的接口列表
问题根源
你的代码里用currentGenericType.IsAssignableTo(iServiceGeneric)判断开放泛型接口的继承关系,这是核心错误——IsAssignableTo/IsAssignableFrom无法直接用于开放泛型接口的继承校验,因为开放泛型没有具体类型参数,无法确认赋值兼容性。比如IProjectService<,>的泛型定义和IService<,>的继承关系,用这个方法会返回false,导致符合条件的接口被过滤。
修正后的代码
var iServiceTypeInterfaces = new List<Type>(); Type iServiceGeneric = typeof(IService<,>); foreach (Type i in Random.GetInterfaces()) { // 先过滤非泛型接口 if (i.IsGenericType) { Type currentGenericType = i.GetGenericTypeDefinition(); // 检查当前泛型接口是否继承自IService<,>,或本身就是IService<,> bool matches = currentGenericType == iServiceGeneric || currentGenericType.GetInterfaces() .Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == iServiceGeneric); if (matches) { iServiceTypeInterfaces.Add(i); } } }
代码说明
- 先判断接口是否为泛型类型,排除非泛型接口的干扰
- 获取当前接口的开放泛型定义(比如从
IProjectService<Project, SearchObj>得到IProjectService<,>) - 双重校验:
- 直接匹配是否是
IService<,>本身 - 检查当前泛型定义的接口列表中是否包含
IService<,>(处理IProjectService<,>这类继承实现的情况)
- 直接匹配是否是
- 符合任一条件就将接口加入目标列表
补充提示
哪怕你的Random类实现的是封闭泛型接口(比如IProjectService<Project, ProjectSearch>),这段代码依然有效——i.GetGenericTypeDefinition()会提取出对应的开放泛型定义,再完成继承关系校验。
内容的提问来源于stack exchange,提问作者Guido Glielmi
相关产品推荐
相关产品推荐

