【问题标题】:How to get module ancestor in roslyn semanticmodel?如何在 roslyn 语义模型中获取模块祖先?
【发布时间】:2014-05-15 02:07:42
【问题描述】:

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

在这样的课程中:

namespace Name1.Name2
{
    using System;
    ...

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

所以我正在尝试获取Ancestor&lt;Param1, Param2&gt;(以及后来的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,但没有找到祖先..

我走在好的路上吗?还是完全迷路了?

【问题讨论】:

  • 您要查找的是 baseclassessuperclasses,而不是“模块祖先”(我假设这是您在另一种语言中使用的术语)。我不确定您是否走对了路,但是通过访问类中的任何类型的节点,您可以使用此代码来获取您的超类:someNode.Ancestors().OfType&lt;ClassDeclarationSyntax&gt;().FirstOrDefault().BaseList.Types 我假设您可以转身寻找从另一个方向。
  • 你说得对,祖先是基类。因此,如果我这样做 root.DescendantNodes().OfType&lt;ClassDeclarationSyntax&gt;().FirstOrDefault() 我可以从 syntaxTree 中获取信息。

标签: c# roslyn


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2015-10-16
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多