如何从FieldDeclarationSyntax节点获取Roslyn FieldSymbol?

24

我正在尝试使用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);
        }
1个回答

45

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

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

1
也适用于本地变量声明。 - JamesFaix
1
并且事件(示例)。 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接