如何从FieldDeclarationSyntax节点获取Roslyn FieldSymbol?

我正在尝试使用Roslyn来确定项目公开的API(然后使用这些信息做一些进一步的处理,所以我不能只使用reflection)。 我正在使用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); } 

我来过几次:)

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

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

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

但是在符号级别上,我发现它们似乎被合并为单个符号(即IFieldSymbol )令人困惑,而实际上某些特征在“字段作为整个声明”上,而不是在变量级别上。

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