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

如何在C#中通过反射查找未显式继承任何类的类型?

查找未显式继承任何类的.NET类型

在.NET中,所有非值类型的类如果没有显式声明基类,编译器会自动让它继承System.Object——这就是你之前用i.BaseType == null无法找到目标类的原因,因为只有Object本身的BaseType才是null。

运行时反射方案(适用于大多数场景)

如果你的需求是找出没有显式继承自定义基类/其他内置类,仅默认继承Object的类,可以用以下代码:

typeof(Program)
    .Assembly.GetTypes()
    .Where(t => 
        t.IsClass &&          // 仅筛选类类型(排除值类型、接口等)
        t != typeof(object) &&// 排除Object本身
        t.BaseType == typeof(object)
    );

这段代码的逻辑是:

  • t.IsClass:确保只处理类类型,排除值类型、接口、委托等不适用的类型
  • t != typeof(object):排除System.Object本身
  • t.BaseType == typeof(object):筛选出基类为Object的类,这类要么是代码中未显式声明基类,要么是显式写了: object的类(编译后两者元数据无区别)

如果需要排除密封类,可以额外添加!t.IsSealed条件。

源代码层面精确区分(严格排查是否显式写了基类)

如果要严格区分“未写任何基类”和“显式写了: object”的情况,只能通过分析源代码实现(比如用Roslyn),因为编译后的元数据无法区分这两种情况。示例代码如下:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.MSBuild;

var workspace = MSBuildWorkspace.Create();
var project = await workspace.OpenProjectAsync("你的项目路径.csproj");

foreach (var document in project.Documents)
{
    var syntaxTree = await document.GetSyntaxTreeAsync();
    var root = await syntaxTree.GetRootAsync();
    
    // 遍历所有类声明
    foreach (var classDecl in root.DescendantNodes().OfType<ClassDeclarationSyntax>())
    {
        // 检查基类列表是否为空(即未显式声明任何基类或接口)
        if (classDecl.BaseList == null || !classDecl.BaseList.Types.Any())
        {
            Console.WriteLine($"找到未显式继承的类:{classDecl.Identifier.Text}");
        }
    }
}

这段代码会扫描项目中的所有类,直接检查语法树里的类声明是否包含基类列表,能精准找出代码中完全没写基类的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:42:23