问题
I'm trying to use Roslyn to determine the publically-exposed API of a project (and then do some further processing using this information, so I can't just use reflection). I'm using a SyntaxWalker to visit declaration syntax nodes, and calling IModel.GetDeclaredSymbol for each. This seems to work well for Methods, Properties, and Types, but it doesn't seem to work on fields. My question is, how do I get the FieldSymbol for a FieldDeclarationSyntax node?
Here's the code I'm working with:
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:
I've been here several times :)
You need to remember that a field declaration syntax can declare multiple fields. So you want:
foreach (var variable in node.Declaration.Variables)
{
var fieldSymbol = model.GetDeclaredSymbol(variable);
// Do stuff with the symbol here
}
回答2:
Can I expand on this? I'm fine with the design path they took separating these on the syntactic level. One field can declare several variables.
But on the symbol level, I find it confusing that they seem to be merged into a single symbol (i.e. IFieldSymbol
), when in fact some traits are on the "field as a whole declaration", not on the variable level.
Consider IFieldSymbol.IsReadOnly
for example. When declaring multiple variables as part of a single field declaration, the readonly constraint is on the field level. And so is the data type. Why would I want to access that information on every possible variable?
来源:https://stackoverflow.com/questions/27848576/how-to-get-a-roslyn-fieldsymbol-from-a-fielddeclarationsyntax-node