Använd Visual Studio och Text Template Transformation Toolkit (T4) för att automatiskt generera kod

Sidan uppdaterad :
Datum för skapande av sida :

Omvärld

Visuell studio
  • Visual Studio 2022
.NÄT
  • .NET 8.0
Windows
  • Windows 11 (på engelska)

Förutsättningar

Visuell studio
  • Det fungerar även med en något äldre version
.NÄT
  • Det fungerar även med en något äldre version

Först

Normalt, när du skapar en kod, tror du att du kommer att skapa en kod genom att skriva tecken manuellt, men om du vill skapa en kod baserad på kod eller data som måste skapas av en specifik lag är det bekvämt att kunna generera den automatiskt. I det här avsnittet beskrivs hur du använder T4 (Text Template Transformation Toolkit) för att automatiskt generera kod.

Eftersom T4 är ett skriptformat är det mycket enkelt att generera kod i Visual Studio direkt efter att du har skapat en T4-fil. Det står skrivet att den automatiskt genererar kod, men det som genereras är bara text, så det är möjligt att generera vad som helst i textformat som XML och JSON förutom program.

Huvudsyftet med det här tipset är att förklara stegen för att faktiskt automatiskt generera kod i T4, så jag kommer inte att gå in på detaljerna i T4 på djupet. Om du någonsin har skrivit ett program i C# kommer du att förstå det direkt. Om du vill veta mer om T4, kolla den officiella webbplatsen och andra webbplatser.

förutsättning

Det här tipset förutsätter följande:

  • Visual Studio installerat på Windows
  • Förståelse för C#

T4 kan användas i de flesta projekt, med undantag för ett fåtal, så du är i princip fri att välja din arbetsbelastning under installationen.

Skapa ett projekt

Som tidigare nämnt kan T4 användas i de flesta projekt, med undantag för ett fåtal, så det spelar ingen roll vilken typ av projekt du skapar. I det här fallet skapar vi ett projekt för en konsolapp.

Skapa en T4-fil (.tt)

Högerklicka på en projektfil eller mapp för att lägga till ett nytt objekt.

Klicka på knappen Visa alla mallar.

Välj "Allmänt" i trädet till vänster och "Textmallar" i listan i mitten. Filnamnet är godtyckligt.

Omedelbart efter att du har skapat filen kan du se en dialogruta som liknar den nedan. Detta visas när T4-filen genereras automatiskt. T4-filer genereras automatiskt varje gång filen sparas eller visas. Om du vill utföra den automatiska genereringsprocessen som den är klickar du på knappen "OK". Om du inte vill att dialogrutan ska visas varje gång markerar du "Visa inte det här meddelandet igen". Observera att om en ogiltig process beskrivs i T4-filen som det står i dialogrutan, kommer den att exekveras i enlighet med detta.

När du har lagt till filen kan du se att .tt-filen har lagts till i Solution Explorer.

Innehållet i filen är följande.

Om du extraherar .tt-filen i Solution Explorer visas en textfil med samma namn. Detta kommer att vara den automatiskt genererade filen. Eftersom vi inte har skrivit något ännu är innehållet i filen tomt.

Göra en automatiskt genererad fil till en .cs fil

Om du använder T4 vill du troligen använda .cs-tillägget istället för standard.txt, eftersom koden för ditt program genereras automatiskt. Öppna i så fall .tt-filen och output extension .cs spara den med .

Den automatiskt genererade filen bör nu ha ett .cs tillägg. Själva filnamnet är detsamma som .tt-filen, så om du vill ändra det ändrar du namnet på .tt-filen.

För tillfället, skriv något och mata ut det till en automatiskt genererad fil

I T4 är innehållet i det du skriver i princip utdata som de är. <# ... #> är T4-processen och resten är den faktiska utdatatexten.

Låt oss till exempel lägga den i en .tt-fil på följande sätt.

<#@ 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 sparar den automatiskt genererade filen ska den matas ut exakt som du skrev den.

Utdata är kod, så naturligtvis kan den också anropas från Program.cs.

Försök att generera kod automatiskt

Som nämnts ovan har jag bekräftat att det jag skrev kommer att vara utdata som det är, men det skiljer sig inte från vad jag skrev normalt. Låt oss nu faktiskt använda T4-skriptet för att automatiskt generera koden. Det finns en mängd olika sätt att göra det på, så ge bara en kort förklaring här och gör sedan om det som du vill göra det.

Den här gången, som ett exempel, ska vi skapa en metod som lägger till en parsningsmetod av varje typ i strängen och returnerar ParseXXXX det angivna standardvärdet om det inte kan konverteras. Detta är bara ett exempel på skapande, så lägg gärna till det om du känner att det är några delar som saknas.

Om du kan förstå C# utan att förklara detaljerna går det snabbare att se det, så jag kommer att lägga upp hela koden 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;
  }
<# } #>
}

Vad vi gör är att definiera de typer List som ska skapas med och sedan vända på dem foreach för att generera det antalet metoder. Skriptdelen av T4 är skriven i C#, så om du förstår C# bör du kunna förstå det.

När du gör detta genereras följande kod:

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 som genereras är kod, så du kan använda den i ditt program som den är.

Lite mer om T4

Även om T4-skriptdelen kan skrivas i C# är det nödvändigt att separera T4 C#-koden från den C#-kod som faktiskt genereras. Den del som gör den skillnaden är <# .... #> . <# .... #> är den kod som körs som ett skript, inte den kod som faktiskt matas ut i skriptdelen av T4.

<# .... #> Innehållet i själva C# förklaras inte eftersom det är som det är, men <# .... #> det finns flera typer av ramar. Det finns följande sätt att använda var och en.

Kod Förklaring
<#@ .... #> Det används främst i deklarationen av olika rubriker. Den används i början av T4-koden i deklarationen av assembly och import .
<# .... #> Skriv kod som bearbetas av T4. Den kan delas in i flera rader. Allt som beskrivs i det här intervallet fungerar bara som en åtgärd och påverkar inte utdatatexten.
<#= .... #> Detta används när du vill mata ut ett värde, till exempel en variabel, som ett utdataresultat. string text = "Sample"; Om du till exempel skriver en variabel <#= text #> som heter , kommer att matas Sample ut.
<#+ .... #> Används för att definiera klasser och metoder. I grund och botten skrivs det i slutet av T4-filen.

Om T4 Editor

Om du inte har något tillägg i Visual Studio visas en .tt-fil i svartvit text utan färg, vilket är ganska svårt att se.

Vissa av dem kan visa ett tillägg för .tt-filer på ett lättläst sätt, så hitta den du gillar. Eftersom det är gjort av volontärer kan innehållet ändras beroende på tid på året och versionen av Visual Studio. Tillägg kan läggas till från Visual Studio-menyn under Tillägg.

Här är vad jag såg i Visual Studio 2022 med ett tillägg som heter "T4 Language".