Gebruik Visual Studio en de Text Template Transformation Toolkit (T4) om automatisch code te genereren

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Werkomgeving

Visuele Studio
  • Visuele Studio 2022
.NET
  • .NET 8.0
Ramen
  • Windows 11

Voorwaarden

Visuele Studio
  • Het werkt zelfs met een wat oudere versie
.NET
  • Het werkt zelfs met een wat oudere versie

Eerst

Normaal gesproken denk je bij het maken van een code dat je een code maakt door handmatig tekens te typen, maar als je een code wilt maken op basis van code of gegevens die door een specifieke wet moeten worden gemaakt, is het handig om deze automatisch te kunnen genereren. In deze sectie wordt beschreven hoe u de Text Template Transformation Toolkit (T4) kunt gebruiken om automatisch code te genereren.

Aangezien T4 een scriptformaat is, is het heel eenvoudig om direct na het maken van een T4-bestand code te genereren in Visual Studio. Er staat geschreven dat het automatisch code genereert, maar wat wordt gegenereerd is gewoon tekst, dus het is mogelijk om naast programma's ook alles in tekstformaat zoals XML en JSON te genereren.

Het belangrijkste doel van deze tip is om de stappen uit te leggen om daadwerkelijk automatisch code te genereren in T4, dus ik zal niet dieper ingaan op de details van T4. Als je ooit een programma in C# hebt geschreven, begrijp je het meteen. Als je meer wilt weten over T4, kijk dan op de officiële website en andere sites.

voorwaarde

Deze tip gaat uit van het volgende:

  • Visual Studio geïnstalleerd op Windows
  • Inzicht in C#

T4 kan in de meeste projecten worden gebruikt, met uitzondering van een paar, dus u bent in principe vrij om uw werklast tijdens de installatie te kiezen.

Een project maken

Zoals eerder vermeld, kan T4 in de meeste projecten worden gebruikt, met uitzondering van een paar, dus het maakt niet uit wat voor soort project je maakt. In dit geval maken we een project voor een console-app.

Een T4-bestand (.tt) maken

Klik met de rechtermuisknop op een projectbestand of map om een nieuw item toe te voegen.

Klik op de knop Alle sjablonen weergeven.

Selecteer "Algemeen" in de boom aan de linkerkant en "Tekstsjablonen" in de lijst in het midden. De bestandsnaam is willekeurig.

Direct na het maken van het bestand ziet u mogelijk een dialoogvenster dat lijkt op het onderstaande. Dit wordt weergegeven wanneer het T4-bestand automatisch wordt gegenereerd. T4-bestanden worden automatisch gegenereerd telkens wanneer het bestand wordt opgeslagen of bekeken. Als u het automatische generatieproces wilt uitvoeren zoals het is, klikt u op de knop "OK". Als u niet wilt dat het dialoogvenster elke keer wordt weergegeven, vinkt u "Dit bericht niet meer weergeven" aan. Houd er rekening mee dat als een illegaal proces wordt beschreven in het T4-bestand zoals vermeld in het dialoogvenster, het dienovereenkomstig zal worden uitgevoerd.

Nadat u het bestand hebt toegevoegd, kunt u zien dat het TT-bestand is toegevoegd aan Solution Explorer.

De inhoud van het dossier is als volgt.

Als u het TT-bestand uitpakt in Solution Explorer, ziet u een tekstbestand met dezelfde naam. Dit is het automatisch gegenereerde bestand. Aangezien we nog niets hebben geschreven, is de inhoud van het bestand leeg.

Van een automatisch gegenereerd bestand een .cs bestand maken

Als u T4 gebruikt, wilt u waarschijnlijk de .cs-extensie gebruiken in plaats van de standaard.txt, omdat de code voor uw programma automatisch wordt gegenereerd. Open in dat geval het .tt-bestand en output extension .cs sla het op met .

Het automatisch gegenereerde bestand zou nu een .cs extensie moeten hebben. De bestandsnaam zelf is hetzelfde als het .tt-bestand, dus als u deze wilt wijzigen, wijzigt u de naam van het .tt-bestand.

Voorlopig iets schrijven en uitvoeren naar een automatisch gegenereerd bestand

In T4 wordt de inhoud van wat je schrijft in feite uitgevoerd zoals ze is. <# ... #> is het T4-proces en de rest is de eigenlijke uitvoertekst.

Laten we het bijvoorbeeld als volgt in een .tt-bestand plaatsen.

<#@ 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!!");
  }
}

Wanneer u het opslaat, zou het automatisch gegenereerde bestand precies zo moeten worden uitgevoerd als u het hebt geschreven.

De output is code, dus natuurlijk kan deze ook vanuit Program.cs worden aangeroepen.

Probeer automatisch code te genereren

Zoals hierboven vermeld, heb ik bevestigd dat wat ik heb geschreven zal worden uitgevoerd zoals het is, maar dit is niet anders dan wat ik normaal schreef. Laten we nu het T4-script gebruiken om de code automatisch te genereren. Er zijn veel verschillende manieren om het te maken, dus geef hier alleen een korte uitleg en maak het dan opnieuw zoals je het wilt maken.

Laten we deze keer als voorbeeld een methode maken die een parseermethode van elk type aan een tekenreeks toevoegt en de opgegeven standaardwaarde retourneert ParseXXXX als deze niet kan worden geconverteerd. Dit is slechts een voorbeeld van creatie, dus voeg het alsjeblieft toe als je denkt dat er onderdelen ontbreken die ontbreken.

Als je C# kunt begrijpen zonder de details uit te leggen, zal het sneller zijn om het te zien, dus ik zal eerst de volledige code posten.

<#@ 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;
  }
<# } #>
}

Wat we doen is voor het eerst de typen List definiëren die moeten worden gemaakt met , en ze foreach vervolgens omdraaien met om dat aantal methoden te genereren. Het scriptgedeelte van T4 is geschreven in C#, dus als je C# begrijpt, zou je het moeten kunnen begrijpen.

Wanneer u dit doet, wordt de volgende code gegenereerd:

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;
  }
}

Wat wordt gegenereerd is code, dus u kunt het in uw programma gebruiken zoals het is.

Een beetje meer over de T4

Hoewel het T4-scriptgedeelte in C# kan worden geschreven, is het noodzakelijk om de T4 C#-code te scheiden van de C#-code die daadwerkelijk wordt gegenereerd. Het deel dat dat onderscheid maakt is <# .... #> . <# .... #> is de code die als script wordt uitgevoerd, niet de code die daadwerkelijk wordt uitgevoerd in het scriptgedeelte van T4.

<# .... #> De inhoud van C# zelf wordt niet uitgelegd omdat ze zijn zoals ze zijn, maar <# .... #> er zijn verschillende soorten frames. Er zijn de volgende manieren om elk te gebruiken.

Code Uitleg
<#@ .... #> Het wordt voornamelijk gebruikt bij de declaratie van verschillende headers. Het wordt gebruikt aan het begin van de T4-code in de assembly aangifte van en import .
<# .... #> Schrijf code die wordt verwerkt door T4. Het kan worden onderverdeeld in meerdere lijnen. Alles wat in dit bereik wordt beschreven, fungeert alleen als een bewerking en heeft geen invloed op de uitvoertekst.
<#= .... #> Dit wordt gebruikt wanneer u een waarde, zoals een variabele, als uitvoerresultaat wilt uitvoeren. string text = "Sample"; Als u bijvoorbeeld een variabele <#= text #> schrijft met de naam , wordt Sample uitgevoerd.
<#+ .... #> Wordt gebruikt om klassen en methoden te definiëren. Kortom, het wordt aan het einde van het T4-bestand geschreven.

Over de T4-editor

Als u geen extensie hebt in Visual Studio, wordt het openen van een .tt-bestand weergegeven in zwart-wittekst zonder kleur, wat nogal moeilijk te zien is.

Sommigen van hen kunnen een extensie voor .tt-bestanden op een gemakkelijk leesbare manier weergeven, dus zoek degene die je leuk vindt. Omdat het wordt gemaakt door vrijwilligers, kan de inhoud veranderen afhankelijk van de tijd van het jaar en de versie van Visual Studio. Extensies kunnen worden toegevoegd vanuit het Visual Studio-menu onder Extensies.

Dit is wat ik zag in Visual Studio 2022 met een extensie genaamd "T4 Language".