Brug Visual Studio og T4 (Text Template Transformation Toolkit) til automatisk at generere kode

Side opdateret :
Dato for oprettelse af side :

Driftsmiljø

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 8.0
Windows
  • Windows 11

Forudsætninger

Visual Studio
  • Det fungerer selv med en noget ældre version
.NET
  • Det fungerer selv med en noget ældre version

Først

Normalt, når du opretter en kode, tror du, at du vil oprette en kode ved at skrive tegn manuelt, men hvis du vil oprette en kode baseret på kode eller data, der skal oprettes ved en bestemt lov, er det praktisk at kunne generere den automatisk. I dette afsnit beskrives det, hvordan du bruger T4 (Text Template Transformation Toolkit) til automatisk at generere kode.

Da T4 er et scriptformat, er det meget nemt at generere kode i Visual Studio umiddelbart efter oprettelse af en T4-fil. Det er skrevet, at det automatisk genererer kode, men det, der genereres, er kun tekst, så det er muligt at generere alt i tekstformat som XML og JSON ud over programmer.

Hovedformålet med dette tip er at forklare trinene til faktisk automatisk at generere kode i T4, så jeg vil ikke gå i dybden med detaljerne i T4. Hvis du nogensinde har skrevet et program i C#, vil du forstå det med det samme. Hvis du vil vide mere om T4, kan du tjekke den officielle hjemmeside og andre websteder.

forudsætning

Dette tip forudsætter følgende:

  • Visual Studio installeret på Windows
  • Forståelse af C#

T4 kan bruges i de fleste projekter, med undtagelse af nogle få, så du er som udgangspunkt fri til at vælge din arbejdsbyrde under installationen.

Opret et projekt

Som tidligere nævnt kan T4 bruges i de fleste projekter, med undtagelse af nogle få, så det er lige meget, hvilken type projekt du opretter. I dette tilfælde opretter vi et projekt til en konsolapp.

Opret en T4-fil (.tt)

Højreklik på en projektfil eller -mappe for at tilføje et nyt element.

Klik på knappen Vis alle skabeloner.

Vælg "Generelt" fra træet til venstre og "Tekstskabeloner" fra listen i midten. Filnavnet er vilkårligt.

Umiddelbart efter oprettelse af filen kan du muligvis se en dialogboks, der ligner den nedenfor. Dette vises, når T4-filen genereres automatisk. T4-filer genereres automatisk, hver gang filen gemmes eller vises. Hvis du vil udføre den automatiske genereringsproces, som den er, skal du klikke på knappen "OK". Hvis du ikke ønsker, at dialogen skal vises hver gang, skal du markere "Vis ikke denne besked igen". Bemærk, at hvis en ulovlig proces er beskrevet i T4-filen som angivet i dialogen, vil den blive udført i overensstemmelse hermed.

Når du har tilføjet filen, kan du se, at .tt-filen er føjet til Solution Explorer.

Indholdet af filen er som følger.

Hvis du udpakker .tt-filen i Solution Explorer, får du vist en tekstfil med samme navn. Dette vil være den automatisk genererede fil. Da vi ikke har skrevet noget endnu, er indholdet af filen tomt.

Gøre en automatisk genereret fil til en .cs fil

Hvis du bruger T4, vil du højst sandsynligt bruge .cs-udvidelsen i stedet for standard.txt, da koden til dit program automatisk genereres. I så fald skal du åbne .tt-filen og output extension .cs gemme den med .

Den automatisk genererede fil skulle nu have en .cs udvidelse. Selve filnavnet er det samme som .tt-filen, så hvis du vil ændre det, skal du ændre navnet på .tt-filen.

Indtil videre skal du skrive noget og udskrive det til en automatisk genereret fil

I T4 udskrives indholdet af det, du skriver, dybest set, som det er. <# ... #> er T4-processen, og resten er den faktiske outputtekst.

Lad os for eksempel lægge det i en .tt-fil som følger.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

public static class Sample
{
  public static void Hello()
  {
    Console.WriteLine("Hello T4!!");
  }
}

Når du gemmer den, bør den automatisk genererede fil udskrives nøjagtigt, som du skrev den.

Outputtet er kode, så det kan selvfølgelig også kaldes fra Program.cs.

Prøv at generere kode automatisk

Som nævnt ovenfor har jeg bekræftet, at det, jeg skrev, vil blive udført, som det er, men det er ikke anderledes end det, jeg normalt skrev. Lad os nu faktisk bruge T4-scriptet til automatisk at generere koden. Der er en lang række måder at lave det på, så giv venligst kun en kort forklaring her, og lav det derefter om, som du vil lave det.

Lad os denne gang som et eksempel oprette en metode, der tilføjer en parsemetode af hver type til streng og returnerer ParseXXXX den angivne standardværdi, hvis den ikke kan konverteres. Dette er blot et eksempel på skabelse, så tilføj det venligst, hvis du føler, at der er dele, der mangler.

Hvis du kan forstå C# uden at forklare detaljerne, vil det være hurtigere at se det, så jeg sender den fulde kode først.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

<#
  List<string> types = new(){"Int", "Short", "Long", "Float", "Double", "Decimal"}; 
#>

public static class ParseExtensions
{
<# foreach (var type in types) { #>
<#   var typeLower = type.ToLower(); #>
  public static <#= typeLower #> Parse<#= type #>(this string self, <#= typeLower #> defaultValue)
  {
    return <#= typeLower #>.TryParse(self, out var val) ? val : defaultValue;
  }
<# } #>
}

Det, vi gør, er at definere typerne List for første gang, der skal oprettes med , og derefter vende dem foreach rundt med for at generere det antal metoder. Script-delen af T4 er skrevet i C#, så hvis du forstår C#, bør du være i stand til at forstå det.

Når du gør dette, genereres følgende kode:

public static class ParseExtensions
{
  public static int ParseInt(this string self, int defaultValue)
  {
    return int.TryParse(self, out var val) ? val : defaultValue;
  }
  public static short ParseShort(this string self, short defaultValue)
  {
    return short.TryParse(self, out var val) ? val : defaultValue;
  }
  public static long ParseLong(this string self, long defaultValue)
  {
    return long.TryParse(self, out var val) ? val : defaultValue;
  }
  public static float ParseFloat(this string self, float defaultValue)
  {
    return float.TryParse(self, out var val) ? val : defaultValue;
  }
  public static double ParseDouble(this string self, double defaultValue)
  {
    return double.TryParse(self, out var val) ? val : defaultValue;
  }
  public static decimal ParseDecimal(this string self, decimal defaultValue)
  {
    return decimal.TryParse(self, out var val) ? val : defaultValue;
  }
}

Det, der genereres, er kode, så du kan bruge den i dit program, som den er.

Lidt mere om T4

Selvom T4-scriptdelen kan skrives i C#, er det nødvendigt at adskille T4 C#-koden fra den C#-kode, der faktisk genereres. Den del, der gør denne skelnen, er <# .... #> . <# .... #> er den kode, der udføres som et script, ikke den kode, der faktisk udskrives i scriptdelen af T4.

<# .... #> Indholdet af C# i sig selv er ikke forklaret, fordi de er, som de er, men <# .... #> der er flere typer rammer. Der er følgende måder at bruge hver på.

Kode Forklaring
<#@ .... #> Det bruges hovedsageligt i deklarationen af forskellige overskrifter. Det anvendes i begyndelsen af T4-koden i deklarationen assembly af og import .
<# .... #> Skriv kode, der behandles af T4. Det kan opdeles i flere linjer. Alt, hvad der er beskrevet i dette område, fungerer kun som en handling og påvirker ikke outputteksten.
<#= .... #> Dette bruges, når du vil udskrive en værdi, f.eks. en variabel, som et outputresultat. string text = "Sample"; Hvis du f.eks. skriver en variabel <#= text #> kaldet , vil der blive Sample udskrevet.
<#+ .... #> Bruges til at definere klasser og metoder. Dybest set er det skrevet i slutningen af T4-filen.

Om T4 Editor

Hvis du ikke har en udvidelse i Visual Studio, vises åbning af en .tt-fil i sort/hvid tekst uden farve, hvilket er ret svært at se.

Nogle af dem kan vise en udvidelse til .tt-filer på en letlæselig måde, så find den, du kan lide. Da det er lavet af frivillige, kan indholdet ændre sig afhængigt af årstiden og versionen af Visual Studio. Udvidelser kan tilføjes fra Visual Studio-menuen under Udvidelser.

Her er, hvad jeg så i Visual Studio 2022 med en udvidelse kaldet "T4 Language".