Uso de Visual Studio y Text Template Transformation Toolkit (T4) para generar código automáticamente

Actualización de la página :
Fecha de creación de la página :

Entorno operativo

Estudio visual
  • Visual Studio 2022
.RED
  • .NET 8.0
Windows
  • Windows 11

Prerrequisitos

Estudio visual
  • Funciona incluso con una versión algo más antigua
.RED
  • Funciona incluso con una versión algo más antigua

Al principio

Normalmente, a la hora de crear un código, piensas que vas a crear un código escribiendo caracteres manualmente, pero si quieres crear un código basado en código o datos que necesitan ser creados por una ley específica, es conveniente poder generarlo automáticamente. En esta sección se describe cómo utilizar el kit de herramientas de transformación de plantillas de texto (T4) para generar código automáticamente.

Dado que T4 es un formato de scripting, es muy fácil generar código en Visual Studio inmediatamente después de crear un archivo T4. Está escrito que genera código automáticamente, pero lo que se genera es solo texto, por lo que es posible generar cualquier cosa en formato de texto como XML y JSON además de programas.

El objetivo principal de este consejo es explicar los pasos para generar código automáticamente en T4, por lo que no entraré en los detalles de T4 en profundidad. Si alguna vez has escrito un programa en C#, lo entenderás de inmediato. Si desea saber más sobre T4, consulte el sitio web oficial y otros sitios.

precondición

Este consejo supone lo siguiente:

  • Visual Studio instalado en Windows
  • Comprensión de C#

T4 se puede utilizar en la mayoría de los proyectos, con la excepción de unos pocos, por lo que básicamente puede elegir su carga de trabajo durante la instalación.

Crear un proyecto

Como se mencionó anteriormente, T4 se puede usar en la mayoría de los proyectos, con la excepción de unos pocos, por lo que no importa qué tipo de proyecto cree. En este caso, estamos creando un proyecto para una aplicación de consola.

Crear un archivo T4 (.tt)

Haga clic con el botón derecho en un archivo o carpeta de proyecto para agregar un nuevo elemento.

Haga clic en el botón Ver todas las plantillas.

Selecciona "General" en el árbol de la izquierda y "Plantillas de texto" en la lista del medio. El nombre del archivo es arbitrario.

Inmediatamente después de crear el archivo, es posible que vea un cuadro de diálogo similar al que se muestra a continuación. Esto se muestra cuando el archivo T4 se genera automáticamente. Los archivos T4 se generan automáticamente cada vez que se guarda o se visualiza. Si desea realizar el proceso de generación automática tal como está, haga clic en el botón "Aceptar". Si no desea que el cuadro de diálogo aparezca cada vez, marque "No volver a mostrar este mensaje". Tenga en cuenta que si se describe un proceso ilegal en el archivo T4 como se indica en el cuadro de diálogo, se ejecutará en consecuencia.

Después de agregar el archivo, puede ver que el archivo .tt se ha agregado al Explorador de soluciones.

El contenido del archivo es el siguiente.

Si extrae el archivo .tt en el Explorador de soluciones, verá un archivo de texto con el mismo nombre. Este será el archivo generado automáticamente. Como aún no hemos escrito nada, el contenido del archivo está vacío.

Convertir un archivo generado automáticamente en un archivo .cs

Si está utilizando T4, lo más probable es que desee usar la extensión .cs en lugar de la predeterminada .txt, ya que el código de su programa se generará automáticamente. En ese caso, abra el archivo .tt y output extension .cs guárdelo con .

El archivo generado automáticamente ahora debería tener una extensión .cs. El nombre del archivo en sí es el mismo que el archivo .tt, por lo que si desea cambiarlo, cambie el nombre del archivo .tt.

Por el momento, escriba algo y envíelo a un archivo generado automáticamente

En T4, el contenido de lo que escribes se genera básicamente tal cual. <# ... #> es el proceso T4, y el resto es el texto de salida real.

Por ejemplo, pongámoslo en un archivo .tt de la siguiente 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!!");
  }
}

Al guardarlo, el archivo generado automáticamente debería mostrarse exactamente como lo escribió.

La salida es código, por lo que, por supuesto, también se puede llamar desde Program.cs.

Intente generar código automáticamente

Como se mencionó anteriormente, he confirmado que lo que escribí se generará tal como está, pero esto no es diferente de lo que escribí normalmente. Ahora, usemos el script T4 para generar automáticamente el código. Hay una gran variedad de formas de hacerlo, así que por favor solo dé una breve explicación aquí, y luego rehágalo como quiera hacerlo.

Esta vez, a modo de ejemplo, vamos a crear un método que agregue un método de análisis de cada tipo a la cadena y devuelva ParseXXXX el valor predeterminado especificado si no se puede convertir. Este es solo un ejemplo de creación, así que por favor agréguelo si siente que hay alguna parte que falta.

Si puede entender C# sin explicar los detalles, será más rápido verlo, por lo que primero publicaré el código completo.

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

Lo que estamos haciendo es definir los tipos List que se van a crear por primera vez con , y luego darles foreach la vuelta para generar ese número de métodos. La parte del script de T4 está escrita en C#, por lo que si entiendes C#, deberías ser capaz de entenderlo.

Al hacerlo, se genera el siguiente código:

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

Lo que se genera es código, por lo que puede usarlo en su programa tal cual.

Un poco más sobre el T4

Aunque la parte del script T4 se puede escribir en C#, es necesario separar el código C# T4 del código C# que se genera realmente. La parte que hace esa distinción es <# .... #> . <# .... #> es el código que se ejecuta como un script, no el código que realmente se genera en la parte del script de T4.

<# .... #> El contenido de C# en sí no se explica porque es como es, pero <# .... #> hay varios tipos de marcos. Hay las siguientes formas de usar cada uno.

Explicación del código
<#@ .... #> Se utiliza principalmente en la declaración de varios encabezados. Se utiliza al principio del código T4 en la assembly declaración de y import .
<# .... #> Escriba el código que es procesado por T4. Se puede dividir en varias líneas. Todo lo descrito en este rango solo actúa como una operación y no afecta al texto de salida.
<#= .... #> Se utiliza cuando se desea generar un valor, como una variable, como resultado de salida. string text = "Sample"; Por ejemplo, si escribe una variable <#= text #> llamada , se Sample generará.
<#+ .... #> Se utiliza para definir clases y métodos. Básicamente, se escribe al final del archivo T4.

Acerca del editor T4

Si no tiene una extensión en Visual Studio, al abrir un archivo .tt se mostrará en texto en blanco y negro sin color, lo cual es bastante difícil de ver.

Algunos de ellos pueden mostrar una extensión para archivos .tt de una manera fácil de leer, así que encuentre el que le guste. Al estar hecho por voluntarios, el contenido puede cambiar en función de la época del año y de la versión de Visual Studio. Las extensiones se pueden agregar desde el menú de Visual Studio en Extensiones.

Esto es lo que vi en Visual Studio 2022 con una extensión llamada "T4 Language".