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
Hallo Palladin007
Kennst du T4? Vielleicht ist das ja was.
Gruss
Alf
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.
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.
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.
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).
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 😃
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 ^^
Dann erzeuge mal dort ein issue, denn Automatic Indent Control (auch bei Multiline) ist ja deren Anspruch.
Schon geschehen ^^