2016-04-29 3 views
4

Ich muss alle Klassenvariablen extrahieren. Aber mein Code gibt alle Variablen zurück, einschließlich Variablen, die in Methoden (Locals) deklariert sind. Zum Beispiel:Wie kann ich alle (und nur) Klassenvariablen abrufen?

class MyClass 
{ 
    private int x; 
    private int y; 

    public void MyMethod() 
    { 
     int z = 0; 
    } 
} 

brauche ich nur x und y zu bekommen, aber ich x, y und z. Mein Code so weit:

SyntaxTree tree = CSharpSyntaxTree.ParseText(content); 
IEnumerable<SyntaxNode> nodes = ((CompilationUnitSyntax) tree.GetRoot()).DescendantNodes(); 

List<ClassDeclarationSyntax> classDeclarationList = nodes 
    .OfType<ClassDeclarationSyntax>().ToList(); 

classDeclarationList.ForEach(cls => 
{ 
    List<MemberDeclarationSyntax> memberDeclarationSyntax = cls.Members.ToList(); 
    memberDeclarationSyntax.ForEach(x => 
    { 
     //contains all variables 
     List<VariableDeclarationSyntax> variables = x.DescendantNodes() 
      .OfType<VariableDeclarationSyntax>().ToList(); 
    }); 
}); 

Antwort

4

Sie sollten für FieldDeclarationSyntax filtern, die offenbar nur auf Felder bezeichnet (auch als Klassenvariablen bekannt).

Ich bin nicht sicher, warum Sie durch den zusätzlichen Reifen von MemberDeclarationSyntax gehen, obwohl: cls.DescendantNodes().OfType<FieldDeclarationSyntax>() sollte gut funktionieren, da Sie immer noch den Baum sowieso überqueren werden.

Danach hält FieldDeclarationSyntax.Declaration was Sie interessiert: die VariableDeclarationSyntax.