Laden...

Einfaches Framework zum generieren von C# (und VB.NET) Code

Erstellt von Palladin007 vor 11 Monaten Letzter Beitrag vor 11 Monaten 733 Views
Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Monaten
Einfaches Framework zum generieren von C# (und VB.NET) Code

Hi,

ich suche ein möglichst nicht zu komplexes Framework, mit dem ich Code in einen Stream/TextWriter schreiben lassen kann.

Inhaltlich brauche ich nicht sehr komplexe Dinge, grob zusammengefasst: (Nested) Klassen, Properties, Methoden und Aufrufe untereinander. Der Code im Property-Getter ist im wesentlichen ein null-Check, ein Objekt-Initializer und ein return. Die Methoden enthalten einmal ein switch und yield return. Aufwändig sind die Objekt-Initializer, da die verschachtelt sind und viele verschiedene Properties mit unterschiedlichen (generierten) Typen setzen.

Ich habe es mit Microsoft.CodeAnalysis.CSharp versucht, allerdings ist das derart komplex, dass ich lieber den guten alten TextWriter nutze 😄
Außerdem kann ich den Ergebnis-SyntaxTree nicht als VB.NET schreiben lassen, womit es für mich keinen Grund mehr gibt, warum ich das nutzen sollte.

Kennt jemand ein Framework, was sowas bietet, .NET Standard 2.0 unterstützt und idealerweise je nach Wahl C# oder VB.NET schreiben kann?
Letzteres (C# vs. VB.NET) ist nice to have, einfach nur damit mein Projekt eine etwas größere Zielgruppe hat, aber nicht notwendig.

Wäre schön, wenn es etwas Geeignetes schon gibt, ansonsten entwickle ich es selbst 😃

Besten Dank und beste Grüße

A
764 Beiträge seit 2007
vor 11 Monaten

Hallo Palladin007

Kennst du T4? Vielleicht ist das ja was.

https://learn.microsoft.com/en-us/visualstudio/modeling/code-generation-and-t4-text-templates?view=vs-2022

Gruss
Alf

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Monaten

Ja kenne ich, passt für meine Anforderungen aber nicht.
Das Ziel ist ein CodeGenerator, der Daten ausliest und in Code gießt, ich brauche also etwas, das ich dynamisch aus C#-Code heraus steuern kann.

D
261 Beiträge seit 2015
vor 11 Monaten

Zitat von Palladin007

Ich habe es mit Microsoft.CodeAnalysis.CSharp versucht, allerdings ist das derart komplex, dass ich lieber den guten alten TextWriter nutze 😄

Für Microsoft.CodeAnalysis.Csharp gibt es http://roslynquoter.azurewebsites.net/ 
Kennst du das schon? Damit kannst du im Grunde den Code vorgeben und er generiert dir die Anweisungen dafür.

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Monaten

Ne, kannte ich noch nicht, hätte mir bei meinen Experimenten damit einiges an Zeit sparen können 😄

Ich hab's gerade auch nochmal getestet und das Ergebnis ist um ein vielfaches größer, komplexer und unleserlicher, als mein manuelles Schreiben. Für eine der Properties, die ich generieren will, müsste ich > 1000 Zeilen SyntaxTree schreiben - das ist mir zu heftig.

Und für VB.NET müsste ich das ganze nochmal machen, zumindest ist die Factory und alles darin C# spezifisch.

Die Seite ist aber ein schönes Projekt, ich hab sie mir mal abgespeichert, wird sicher nochmal nützlich.

4.931 Beiträge seit 2008
vor 11 Monaten

Schau dir mal CodegenCS an. Die Templates selbst werden in C# geschrieben und verwenden einen TextWriter zur Ausgabe (ähnlich deinem bisherigen Ansatz), so daß du also beliebigen Code erzeugen kannst. Um direkt den Code aus deinem Projekt zu erzeugen, kannst du die CodegenCS Core Library benutzen (anstatt dem CLI-Command dotnet-codegencs).

Als Beispiel: DatabaseSchema/SimplePocos mit SimplePocos.cs als Template (schau dir besonders die file.WriteLine Aufrufe dort an).

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Monaten

So auf den ersten Blick sieht das nach einem guten Konzept aus, ich hatte anfangs auch die Raw String Literals genutzt, bin dann aber davon abgewichen, weil das in manchen Fällen problematischen Code produziert hat.
Eventuell geht das damit besser, dann könnte ich wieder die Raw String Literals, die ja unschlagbar übersichtlich sind.

Ist nicht ganz das, was ich mir erhofft habe, aber es könnte meinen bisherigen Code einfacher machen, das ist schon mal besser, als nichts.
Ich teste es auf jeden Fall, wenn das funktioniert und es kein besseres Framework gibt, dann nutze ich das.

Danke für den Tipp 😃

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Monaten

Ich hab's jetzt eingebaut und es macht meinen Code schon deutlich übersichtlicher.
Es hatte nur das gleiche Problem, warum ich Raw String Literals nicht genutzt hatte: Es verfälscht bei mehrzeiligen Strings die Einrückungen.
Ich hab eine Lösung gefunden, nicht schön, aber funktionsfähig und das reicht mir.
Und als T4-Alternative ist es definitiv besser.

Ich werde es erst einmal so übernehmen, allein schon für den übersichtlicheren Code.

Wenn noch ein anderes Framework kennt, bin ich offen für Vorschläge ^^

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 11 Monaten

Schon geschehen ^^