Wie konvertiert man Ausdruck in CSharpCompilation oder CSharpSyntaxTree?

8

Wie konvertiert man:

%Vor%

In:

%Vor%

Oder in:

%Vor%

Ich brauche die nächsten spezifischen Fälle, um wie eine der Optionen zu funktionieren:

  • Ich kann Expression und CSharpSyntaxTree auf das gleiche Verhalten des ausführbaren Codes kompilieren

  • Wenn ich den manuell eingegebenen C # -Ausdruck ansehe, kann ich CSharpSyntaxTree erhalten und es wird der gleiche Code erzeugt.

    %Vor%

UPDATE:

Ansatz Expression -> string -> Roslyn in inakzeptabel. Die Konvertierung sollte direkt sein.

    
Dzmitry Lahoda 14.02.2018, 15:16
quelle

2 Antworten

3

Siehe hier Syntax-Transformation

  

Da die Syntaxbäume unveränderlich sind, bietet die Syntax-API keinen direkten Mechanismus zum Ändern eines vorhandenen Syntaxbaums nach der Konstruktion. Die Syntax-API bietet jedoch Methoden zum Erzeugen neuer Bäume basierend auf bestimmten Änderungen an bestehenden Bäumen. Jede konkrete Klasse, die von SyntaxNode abgeleitet ist, definiert With * -Methoden, mit denen Sie Änderungen an ihren untergeordneten Eigenschaften angeben können.

     

Darüber hinaus kann die ReplaceNode-Erweiterungsmethode verwendet werden, um einen untergeordneten Knoten in einem Teilbaum zu ersetzen. Ohne diese Methode würde das Aktualisieren eines Knotens auch eine manuelle Aktualisierung des übergeordneten Elements erfordern, um auf das neu erstellte untergeordnete Element zu verweisen und diesen Prozess über die gesamte Struktur zu wiederholen.

     
  • ein Prozess, der als Repinieren des Baums bezeichnet wird.
  •   

Beispiel - Transformationen mit den Methoden With * und ReplaceNode:

%Vor%

Probieren Sie es live aus: Ссылка

    
AsifAli72090 26.02.2018 14:44
quelle
2

Der einfachste Weg, Expression in Roslyn SyntaxTree umzuwandeln, wäre:

  1. Konvertiere Expression in den entsprechenden Quellcode.
  2. Analysiere Quellcode des Ausdrucks mit CSharpSyntaxTree.ParseText() .

Wir haben im Grunde ein Problem reduziert, indem wir Expression in seinen Quellcode konvertiert haben. Diese Frage wurde bereits zu SO gestellt. Unter den Antworten schlug Steve Wilkes seine Bibliothek AgileObjects.ReadableExpressions vor. Es bietet grundsätzlich eine Erweiterungsmethode ToReadableString() auf Expression :

%Vor%

Ich habe diese Bibliothek mit verschiedenen Ausdrücken ausprobiert und es funktioniert einwandfrei.

Damit Sie auf Ihr Problem zurückkommen, wird die Lösung, die auf dieser Bibliothek basiert, sehr einfach sein:

  1. Installieren Sie AgileObjects.ReadableExpressions NuGet-Paket.
  2. Definieren Sie die folgende Erweiterungsmethode für Expression :

    %Vor%

Jetzt könntest du es versuchen:

%Vor%

Dieser Ausdruck wird in den folgenden Code konvertiert:

%Vor%

, das erfolgreich auf die entsprechende SyntaxTree analysiert wurde.

    
CodeFuller 27.02.2018 06:30
quelle

Tags und Links