gpt4 book ai didi

c# - 如何在 roslyn 语义模型中获取模块祖先?

转载 作者:行者123 更新时间:2023-11-30 15:29:30 25 4
gpt4 key购买 nike

我希望从模块的 roslyn 语义模型中获取祖先。

在这样的类中:

namespace Name1.Name2
{
using System;
...

public partial class MyClass : Ancestor<Param1, Param2>
{
}
}

所以我想得到 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));

我正在寻找 compilation.Assembly.Modules但找不到祖先..

我走得好吗?还是完全迷路了?

最佳答案

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

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

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

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

关于c# - 如何在 roslyn 语义模型中获取模块祖先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23650723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com