如何从FieldDeclarationSyntax节点获取Roslyn FieldSymbol?

时间:2015-01-08 20:01:35

标签: c# roslyn

我试图使用Roslyn来确定项目公开的API(然后使用这些信息做一些进一步的处理,所以我不能只使用反射)。我使用SyntaxWalker访问声明语法节点,并为每个节点调用IModel.GetDeclaredSymbol。这似乎适用于方法,属性和类型,但它似乎不适用于字段。我的问题是,如何为FieldDeclarationSyntax节点获取FieldSymbol?

以下是与我合作的代码:

        public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
        {
            var model = this._compilation.GetSemanticModel(node.SyntaxTree);
            var symbol = model.GetDeclaredSymbol(node);
            if (symbol != null
                && symbol.CanBeReferencedByName
                // this is my own helper: it just traverses the publ
                && symbol.IsExternallyPublic())
            {
                this._gatherer.RegisterPublicDeclaration(node, symbol);
            }

            base.VisitFieldDeclaration(node);
        }

2 个答案:

答案 0 :(得分:26)

我好几次来过这里:)

您需要记住,字段声明语法可以声明多个字段。所以你想要:

foreach (var variable in node.Declaration.Variables)
{
    var fieldSymbol = model.GetDeclaredSymbol(variable);
    // Do stuff with the symbol here
}

答案 1 :(得分:2)

我可以扩展一下吗?我对他们在语法层面上分离这些设计路径很好。一个字段可以声明几个变量。

但是在符号级别上,我发现它们似乎被合并为单个符号(即 <body> <div id="1">one</div> <div id="2">two</div> </body> )令人困惑,实际上某些特征在&#34;字段上作为一个整体声明&# 34;而不是在变量级别。

例如考虑IFieldSymbol。将多个变量声明为单个字段声明的一部分时,只读约束位于字段级别。数据类型也是如此。为什么我要访问每个可能变量的信息?