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

时间:2014-05-14 09:31:07

标签: c# roslyn

我希望从模块的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,但找不到祖先......

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

1 个答案:

答案 0 :(得分:4)

如果您正在尝试获取基类,请执行以下操作:

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#中,您不能使用语法来确定基类型,因为如果您有两个部分类声明,则只需要其中一个需要具有基类型。唯一“正确”的方法是使用语义。