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.
UPDATE:
Ansatz Expression -> string -> Roslyn
in inakzeptabel. Die Konvertierung sollte direkt sein.
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: Ссылка
Der einfachste Weg, Expression
in Roslyn SyntaxTree
umzuwandeln, wäre:
Expression
in den entsprechenden Quellcode. 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
:
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:
Definieren Sie die folgende Erweiterungsmethode für Expression
:
Jetzt könntest du es versuchen:
%Vor%Dieser Ausdruck wird in den folgenden Code konvertiert:
%Vor%, das erfolgreich auf die entsprechende SyntaxTree
analysiert wurde.