如何判断C#类型是否直接实现指定接口而非继承所得
如何判断C#类型是否直接实现了指定接口
要筛选出直接声明实现isState接口的类型,可以通过反射对比当前类型与基类的接口集合,找出仅属于当前类型的接口成员。具体逻辑是:如果某个接口存在于当前类型的接口列表中,但不存在于其基类的接口列表中,就说明该接口是当前类型直接实现的。
实现代码
修改你的Main方法,添加如下筛选逻辑:
public static void Main() { List<Type> types = new List<Type>{typeof(A), typeof(B), typeof(C), typeof(ANotState), typeof(BNotState)}; // 筛选直接实现isState接口的类型 var directImplementers = types.Where(type => { // 获取当前类型实现的所有接口 var currentInterfaces = type.GetInterfaces(); if (!currentInterfaces.Contains(typeof(isState))) return false; // 获取基类实现的所有接口(基类为null时返回空集合) var baseInterfaces = type.BaseType?.GetInterfaces() ?? Array.Empty<Type>(); // 检查isState是否是当前类型新增的(即不是从基类继承的) return !baseInterfaces.Contains(typeof(isState)); }).ToList(); // 输出结果验证 foreach (var type in directImplementers) { Console.WriteLine(type.Name); // 会输出A、B、C } }
原理说明
Type.GetInterfaces():获取当前类型直接或间接实现的所有接口。type.BaseType?.GetInterfaces():获取当前类型基类实现的所有接口,基类为object时(比如A类),BaseType.GetInterfaces()返回空数组。- 对比两个集合:如果
isState在当前类型的接口中,但不在基类的接口中,就证明该接口是当前类型直接声明实现的,而非通过继承获得。
特殊情况处理
- 对于
object的子类(如A类):基类接口集合为空,只要当前类型实现了isState,就判定为直接实现。 - 对于抽象类(如B、C):即使继承了已实现接口的类,只要自身再次声明实现
isState,就会被判定为直接实现(符合你的需求)。
内容的提问来源于stack exchange,提问作者Panakvina321
相关产品推荐
相关产品推荐

