Wir versuchen herauszufinden, wie man mit Roslyn Code erzeugt. Ich spreche nicht von etwas wie CSharpSyntaxTree.ParseText
, das einige Zeichenfolgen braucht und sie in einen AST umwandelt. Stattdessen möchte ich mein Modell irgendwie so aufbauen (Pseudocode):
file
als Kompilierungseinheit MyClass
zu file
DoSomething
zu MyClass
hinzu
DoSomething
in ähnlicher Weise wie System.Linq.Expressions
Wir haben kürzlich Microsoft.CodeAnalysis.CSharp.SyntaxFactory
entdeckt und es schien vielversprechend zu sein. Allerdings müssen wir natürlich selbst etwas hinzufügen.
Nachdem Sie einen Baum mit SyntaxFactory.CompilationUnit()
erstellt und einige Elemente hin und her hinzugefügt haben, ist die Ausgabe von ToFullString()
nur ein Haufen Text, der weder lesbar noch kompilierbar ist (z. B. fehlende Klammern). Vermissen wir etwas beim Erzeugen des Textes aus dem Modell?
BEARBEITEN:
Wenn Sie Arbeitsbereiche verwenden, können Sie Optionen festlegen, die sich auf das Whitespace-Verhalten auswirken:
%Vor%Dies führt bereits zu einem besseren Ergebnis. Kann jemand dies als eine gute Lösung bestätigen oder ist es eher ein Hack?
Ein Problem bleibt bestehen. Wir möchten eine Auto-Eigenschaft generieren, die derzeit SF.AccessorDeclaration
verwendet, aber das Semikolon bei der Konvertierung in die vollständige Zeichenfolge nicht enthält.
Sie müssen grundsätzlich Blockdefinitionen hinzufügen, dann behandelt Roslyn das Wissen für Sie, solange Sie den Formatierer verwenden (wie Sie es geschrieben haben)
Hier ist ein Beispiel für eine einfache Klasse, die korrekt generiert wird, ohne dass ich irgendwelche Kleinigkeiten angeben muss
%Vor%Hinweis: Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory
Dies erzeugt die folgende Klassen-Definition:
%Vor%Scheint gut.