C#/Visual Studio - skapa nya klasser baserat på attributer i andra klasser?

Permalänk
Medlem

C#/Visual Studio - skapa nya klasser baserat på attributer i andra klasser?

Hejsan

Vad finns för bra alternativ om jag vill skapa nya klasser utifrån attribut på andra klasser (och få dessa ny klasser som *.cs filer)

Exempel:

[RequireDTO] Class A{ [RequireDTO] public string Value1; public Bar Value2; }

Skulle då skapas en ny klass

Class ADTO{ public string Value1; }

Är det att skapa en consol-application och sedan köra reflektion över de assemblies som är av intresse, eller mer "brute force" och läsa varje rad i *.cs filerna och skapa utifrån det.

Googlar jag på att skapa klasser via kod så får jag ex CodeDom som förslag, men det verkar långt ifrån enkelt...Source Generators kommer också upp

Är inte intresserad av "färdiga" plugins, om de nu inte finns inbyggda i VS

Permalänk
Medlem

Spontant enklast känns att välja reflectionvägen med en liten console-applikation som sagt, men jag har inte pysslat särskilt mycket med källkodsgenerering så jag är definitivt ingen auktoritet i området.

(Det kanske finns något jättesmidigt färdigt för detta som jag inte känner till, menar jag.)

Visa signatur

5950X, 3090

Permalänk
Avstängd

VS kan ju skapa en hel del saker åt dig men hur ska den veta att du vill ha en klass som heter ADTO till din klass A? Annars kan du testa Jetbrains Resharper, jag körde det i många år men VS har blivit såpass bra på sånt att jag skippat det på senaste datorn, det har ju en tendens att göra allt lite segare.

Permalänk
Medlem

Trevlig ide.

Jo det borde vara relativt trivialt att sätta ihop ett eget litet lib med attributen och en konsoll-app som kan köras som build event som genererar DTO-klasserna och eventuellt Automapper-konfigurationer.

Om man vill lyxa till det går det säkert att jacka in kodgenereringen snyggare i MSBuild, så som till exempel NSwag gör när man använder det för att generera klienter (se Nuget-paketet NSwag.MSBuild).

Mina DTO:er har oftast olika request- och response-varianter som ärver från en gemensam basklass. Man kan ju till exempel vilja att request/POST-varianten ska sakna Id-property (det tilldelas av databasen), medan response/GET-varianten har Id-property. Sådant kan man ju vilja styra i genereringen, genom properties på attributen.

Edit: Det knepigaste är nog att få in nya DTO-.cs-filer i projektet. Kanske kan man nöja sig med att ha alla DTO-klasser i samma fil? Det är ju ändå inget man ska redigera för hand.

Permalänk
Medlem

Det är ju inga konstigheter, bara bygga ett script som körs i build pipelinen som skapar filerna. Dock synnerligen osäkert om det är en speciellt bra ide.

Om vi spolar tillbaka bandet, vad försöker du lösa?

Permalänk
Medlem
Skrivet av snajk:

VS kan ju skapa en hel del saker åt dig men hur ska den veta att du vill ha en klass som heter ADTO till din klass A? Annars kan du testa Jetbrains Resharper, jag körde det i många år men VS har blivit såpass bra på sånt att jag skippat det på senaste datorn, det har ju en tendens att göra allt lite segare.

Om en klass ha attributen [RequireDTO] så ska DTO-klassen heta orginal-klassnamn + DTO. VS kan så mycket och jag förstår och nyttjar så lite

Skrivet av KAD:

Trevlig ide.

Jo det borde vara relativt trivialt att sätta ihop ett eget litet lib med attributen och en konsoll-app som kan köras som build event som genererar DTO-klasserna och eventuellt Automapper-konfigurationer.

Om man vill lyxa till det går det säkert att jacka in kodgenereringen snyggare i MSBuild, så som till exempel NSwag gör när man använder det för att generera klienter (se Nuget-paketet NSwag.MSBuild).

Mina DTO:er har oftast olika request- och response-varianter som ärver från en gemensam basklass. Man kan ju till exempel vilja att request/POST-varianten ska sakna Id-property (det tilldelas av databasen), medan response/GET-varianten har Id-property. Sådant kan man ju vilja styra i genereringen, genom properties på attributen.

Edit: Det knepigaste är nog att få in nya DTO-.cs-filer i projektet. Kanske kan man nöja sig med att ha alla DTO-klasser i samma fil? Det är ju ändå inget man ska redigera för hand.

Vilken metod tänker du då är bäst för att generera DTO-klasserna? Tittade på några exempel på github där man använder MSBuild. Sätta upp en Task för det verkar inte vara så svårt.

Skrivet av Ernesto:

Det är ju inga konstigheter, bara bygga ett script som körs i build pipelinen som skapar filerna. Dock synnerligen osäkert om det är en speciellt bra ide.

Om vi spolar tillbaka bandet, vad försöker du lösa?

"bara bygga ett script" - lätt och bara om man vet vad man gör Jag försöker lösa att jag tycker det är trist att skapa DTO-klasser och att kunna auto-skapa dem hade varit en intressant och givande bedrift.