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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:06:32