2017-11-14 2 views
1

Ich arbeite an einem Analysator für C# -Compiler. Eine meiner Aufgaben besteht darin, sicherzustellen, dass die set Methode jeder Klasseneigenschaft eine bestimmte Methode in ihre Ausführungskörper aufruft.Überprüfung eines Eigenschaftenausführungskörpers für einen bestimmten Methodenaufruf

nehme ich die folgenden einfachen Klassen haben:

public class SomeClass 
{ 
    public void SetPropertyValue(int propertyValue) 
    { 
     // some code here 
    } 
} 

public class MyClass : SomeClass 
{ 
    public int MyProperty1 
    { 
     set => SetPropertyValue(value); 
    } 

    public int MyProperty2 
    { 
     set => AnotherMethod(value); 
    } 
} 

Angenommen Objektklassendeklaration in myClassTypeSymbol mit Typ INamedTypeSymbol gespeichert ist.

ich alle Immobilienobjekte zur Analyse über den Aufruf:

var propertyObjects = myClassTypeSymbol.OfType<IPropertySymbol>(); 

Nun propertyObjects enthält Enumeration mit MyProperty1 und MyProperty2 innen.

Ich iterieren über diese Aufzählung und erhalten set Methode für jede Eigenschaft.

foreach (var onePropertyObject in propertyObjects) 
{ 
    IMethodSymbol setMethod = onePropertyObject.SetMethod; 

    // setMethod contains "set" method of a processing property. 

    // how can I test here, 
    // that setMethod contains invocation of SetPropertyValue() method? 
} 
+0

Ist dies für einen Komponententest? –

+0

Ja, es ist für Unit-Test. –

+0

Und darfst du 'SomeClass' ändern? Wenn ja, wäre es ein naheliegender Vorschlag, ein 'PropertyChanged'-Style-Event von' SetPropertyValue() 'zu starten - aber ich könnte mir vorstellen, dass Sie diese Idee bereits erwogen und verworfen haben ... –

Antwort

0

Soweit ich aus der Dokumentation verstanden gibt es keine Möglichkeit Methode Körper von setMethod Variable zu erhalten.

Aber es ist möglich, wenn wir mit Syntax-Baum und Prozess Syntax Tree-Knoten arbeiten.

Verwenden CSharpSyntaxTree Code zu analysieren, wie folgt aus:

var tree = CSharpSyntaxTree.ParseText(@" 
    // code to be analyzed goes here 
"); 

dann den Wurzelknoten für die Syntaxbaum erhalten:

SyntaxNode rootNode = tree.GetRoot(); 

Und dann kann man Klassen deklariert bekommen, Methoden und Eigenschaften:

Dann verwenden Sie DescendantNodes() Aufruf, um Nachkommen sy zu bekommen ntax Knoten und GetText(), um den zu analysierenden Knotentext zu erhalten.

Das ist es.

Verwandte Themen