如何获取roslyn语义模型中的模块祖先?

Pas*_*TeK 3 c# roslyn

我正在寻找从模块的 roslyn 语义模型中获取祖先。

在这样的课程中:

namespace Name1.Name2
{
    using System;
    ...

    public partial class MyClass : Ancestor<Param1, Param2>
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我试图得到 Ancestor<Param1, Param2>(以及后来的Param1Param2)。

我使用此代码来创建语义模型:

SyntaxTree tree = CSharpSyntaxTree.ParseFile(moduleAutoGenPath);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
var nameSpace = ((NamespaceDeclarationSyntax)(root.Members[0])).Name.ToString();
var compilation = CSharpCompilation.Create(nameSpace, new[] { tree }).AddReferences(new MetadataFileReference(typeof(object).Assembly.Location));
Run Code Online (Sandbox Code Playgroud)

我正在寻找,compilation.Assembly.Modules但没有找到祖先。

我的路还好吗?还是完全迷失了?

Jas*_*ski 5

如果您想获取基类,请执行以下操作:

var classDeclaration = someNode.Ancestors().OfType<ClassDeclarationSyntax>().First();
var semanticModel = compilation.GetSemanticModel(tree);
var type = semanticModel.GetDeclaredSymbol(classDeclaration)
Run Code Online (Sandbox Code Playgroud)

这将为您提供表示该语法的语义类型符号。如果尚未将其转换为 ITypeSymbol,并访问它的 BaseType 属性以获取基本类型。

正如 Jeroen 的评论中提到的:“模块”在 .NET 世界中是完全不相关的事物。compilation.Assembly.Modules不会有任何与类型相关的东西。在 C# 中,不能使用语法来确定基类型,因为如果有两个分部类声明,则只有其中之一需要具有基类型。唯一“正确”的方法是使用语义。