如何在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
相关产品推荐
相关产品推荐

