Utilitzeu Visual Studio i el Text Template Transformation Toolkit (T4) per generar codi automàticament

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn operatiu

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

Prerequisits

Visual Studio
  • Funciona fins i tot amb una versió una mica més antiga
.XARXA
  • Funciona fins i tot amb una versió una mica més antiga

Al principi

Normalment, a l'hora de crear un codi, penses que crearàs un codi escrivint caràcters manualment, però si vols crear un codi basat en codi o dades que necessiten ser creades per una llei concreta, és convenient poder generar-lo automàticament. Aquesta secció descriu com utilitzar el Text Template Transformation Toolkit (T4) per generar codi automàticament.

Com que T4 és un format de scripting, és molt fàcil generar codi a Visual Studio immediatament després de crear un fitxer T4. Està escrit que genera codi automàticament, però el que es genera és només text, de manera que és possible generar qualsevol cosa en format de text com XML i JSON a més de programes.

L'objectiu principal d'aquest consell és explicar els passos per generar codi automàticament a T4, de manera que no entraré en detalls de T4 en profunditat. Si alguna vegada heu escrit un programa en C#, l'entendreu de seguida. Si voleu saber més sobre T4, consulteu el lloc web oficial i altres llocs.

Precondició

Aquest consell suposa el següent:

  • Visual Studio instal·lat al Windows
  • Comprensió de C#

T4 es pot utilitzar en la majoria de projectes, amb l'excepció d'alguns, de manera que bàsicament sou lliure de triar la vostra càrrega de treball durant la instal·lació.

Crear un projecte

Com s'ha esmentat anteriorment, T4 es pot utilitzar en la majoria de projectes, amb l'excepció d'uns quants, de manera que no importa quin tipus de projecte creeu. En aquest cas, estem creant un projecte per a una aplicació de consola.

Crear un fitxer T4 (.tt)

Feu clic amb el botó dret en un fitxer o carpeta de projecte per afegir un element nou.

Feu clic al botó Mostra totes les plantilles.

Seleccioneu "General" de l'arbre de l'esquerra i "Plantilles de text" de la llista del mig. El nom del fitxer és arbitrari.

Immediatament després de crear el fitxer, és possible que vegeu un diàleg similar al següent. Això es mostra quan el fitxer T4 es genera automàticament. Els fitxers T4 es generen automàticament cada vegada que es desa o visualitza el fitxer. Si voleu realitzar el procés de generació automàtica tal com està, feu clic al botó "D'acord". Si no vols que el diàleg aparegui cada vegada, marca "No tornis a mostrar aquest missatge". Tingueu en compte que si es descriu un procés il·legal al fitxer T4 tal com s'indica al diàleg, s'executarà en conseqüència.

Després d'afegir el fitxer, podeu veure que el fitxer .tt s'ha afegit a l'Explorador de solucions.

El contingut del fitxer és el següent.

Si extreu el fitxer .tt a l'Explorador de solucions, veureu un fitxer de text amb el mateix nom. Aquest serà el fitxer generat automàticament. Com que encara no hem escrit res, el contingut del fitxer està buit.

Convertir un fitxer generat automàticament en un fitxer .cs

Si utilitzeu T4, és probable que vulgueu utilitzar l'extensió .cs en lloc de la .txt predeterminada, ja que el codi del vostre programa es generarà automàticament. En aquest cas, obriu el fitxer .tt i output extension .cs deseu-lo amb .

El fitxer generat automàticament ara hauria de tenir una extensió .cs. El nom del fitxer en si és el mateix que el fitxer .tt, de manera que si voleu canviar-lo, canvieu el nom del fitxer .tt.

De moment, escriviu alguna cosa i envieu-la a un fitxer generat automàticament

A T4, el contingut del que escrius es produeix bàsicament tal com és. <# ... #> és el procés T4 i la resta és el text de sortida real.

Per exemple, posem-lo en un fitxer .tt de la següent manera.

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

Quan el deseu, el fitxer generat automàticament hauria de sortir exactament com l'heu escrit.

La sortida és codi, així que, per descomptat, també es pot cridar des de Program.cs.

Provar de generar codi automàticament

Com s'ha esmentat anteriorment, he confirmat que el que he escrit es produirà tal com és, però això no és diferent del que he escrit normalment. Ara, utilitzem l'script T4 per generar automàticament el codi. Hi ha una gran varietat de maneres de fer-ho, així que si us plau, només doneu una breu explicació aquí i després torneu-lo a fer com vulgueu.

Aquesta vegada, com a exemple, creem un mètode que afegeixi un mètode d'anàlisi de cada tipus a la cadena i retorni ParseXXXX el valor predeterminat especificat si no es pot convertir. Aquest és només un exemple de creació, així que si us plau, afegiu-lo si creieu que hi ha alguna part que falten.

Si podeu entendre C# sense explicar els detalls, serà més ràpid veure-ho, així que primer publicaré el codi complet.

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

El que estem fent és definir els tipus List per primera vegada que es crearan amb , i després donar-los foreach la volta amb per generar aquest nombre de mètodes. La part de l'script de T4 està escrita en C#, de manera que si enteneu C#, hauríeu de ser capaços d'entendre-la.

Quan feu això, es genera el codi següent:

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

El que es genera és codi, de manera que podeu utilitzar-lo en el vostre programa tal qual.

Una mica més sobre el T4

Tot i que la part de l'script T4 es pot escriure en C#, cal separar el codi C# T4 del codi C# que es genera realment. La part que fa aquesta distinció és <# .... #> . <# .... #> és el codi que s'executa com a script, no el codi que realment es genera a la part de script de T4.

<# .... #> El contingut de C# en si no s'explica perquè són com són, però <# .... #> hi ha diversos tipus de fotogrames. Hi ha les següents maneres d'utilitzar cadascun.

Explicació del codi
<#@ .... #> S'utilitza principalment en la declaració de diverses capçaleres. S'utilitza a l'inici del codi T4 en la assembly declaració de i import .
<# .... #> Escriu codi processat per T4. Es pot dividir en diverses línies. Tot el que es descriu en aquest interval només actua com una operació i no afecta el text de sortida.
<#= .... #> S'utilitza quan voleu generar un valor com una variable com a resultat de sortida. string text = "Sample"; Per exemple, si escriviu una variable <#= text #> anomenada , sortirà Sample .
<#+ .... #> S'utilitza per definir classes i mètodes. Bàsicament, s'escriu al final del fitxer T4.

Sobre l'editor T4

Si no teniu una extensió a Visual Studio, l'obertura d'un fitxer .tt es mostrarà en text en blanc i negre sense color, que és bastant difícil de veure.

Alguns d'ells poden mostrar una extensió per als fitxers .tt d'una manera fàcil de llegir, així que busqueu el que us agradi. Com que està fet per voluntaris, el contingut pot canviar en funció de l'època de l'any i de la versió de Visual Studio. Les extensions es poden afegir des del menú del Visual Studio a Extensions.

Això és el que vaig veure a Visual Studio 2022 amb una extensió anomenada "T4 Language".