Utilizzare Visual Studio e Text Template Transformation Toolkit (T4) per generare automaticamente il codice

Pagina aggiornata :
Data di creazione della pagina :

Ambiente operativo

Studio visivo
  • Studio visivo 2022
.RETE
  • .NET 8.0
Finestre
  • finestre 11

Prerequisiti

Studio visivo
  • Funziona anche con una versione un po' più vecchia
.RETE
  • Funziona anche con una versione un po' più vecchia

Dapprima

Normalmente, quando si crea un codice, si pensa che si creerà un codice digitando manualmente i caratteri, ma se si desidera creare un codice basato su codice o dati che devono essere creati da una legge specifica, è conveniente poterlo generare automaticamente. In questa sezione viene descritto come utilizzare Text Template Transformation Toolkit (T4) per generare automaticamente il codice.

Poiché T4 è un formato di scripting, è molto semplice generare codice in Visual Studio subito dopo la creazione di un file T4. È scritto che genera automaticamente codice, ma ciò che viene generato è solo testo, quindi è possibile generare qualsiasi cosa in formato testo come XML e JSON oltre ai programmi.

Lo scopo principale di questo suggerimento è spiegare i passaggi per generare automaticamente il codice in T4, quindi non entrerò nei dettagli di T4 in modo approfondito. Se avete mai scritto un programma in C#, lo capirete subito. Se vuoi saperne di più su T4, controlla il sito Web ufficiale e altri siti.

precondizione

Questo suggerimento presuppone quanto segue:

  • Visual Studio installato in Windows
  • Comprensione di C#

T4 può essere utilizzato nella maggior parte dei progetti, ad eccezione di alcuni, quindi sei fondamentalmente libero di scegliere il tuo carico di lavoro durante l'installazione.

Creare un progetto

Come accennato in precedenza, T4 può essere utilizzato nella maggior parte dei progetti, ad eccezione di alcuni, quindi non importa quale tipo di progetto crei. In questo caso, stiamo creando un progetto per un'app console.

Creare un file T4 (.tt)

Fare clic con il pulsante destro del mouse su un file o una cartella di progetto per aggiungere un nuovo elemento.

Fare clic sul pulsante Visualizza tutti i modelli.

Seleziona "Generale" dall'albero a sinistra e "Modelli di testo" dall'elenco al centro. Il nome del file è arbitrario.

Subito dopo aver creato il file, potresti vedere una finestra di dialogo simile a quella qui sotto. Viene visualizzato quando il file T4 viene generato automaticamente. I file T4 vengono generati automaticamente ogni volta che il file viene salvato o visualizzato. Se si desidera eseguire il processo di generazione automatica così com'è, fare clic sul pulsante "OK". Se non vuoi che la finestra di dialogo venga visualizzata ogni volta, seleziona "Non mostrare più questo messaggio". Si prega di notare che se nel file T4 viene descritto un processo illegale come indicato nella finestra di dialogo, verrà eseguito di conseguenza.

Dopo aver aggiunto il file, è possibile vedere che il file con estensione tt è stato aggiunto a Esplora soluzioni.

Il contenuto del file è il seguente.

Se si estrae il file con estensione tt in Esplora soluzioni, verrà visualizzato un file di testo con lo stesso nome. Questo sarà il file generato automaticamente. Poiché non abbiamo ancora scritto nulla, il contenuto del file è vuoto.

Trasformare un file generato automaticamente in un file .cs

Se stai utilizzando T4, molto probabilmente vorrai utilizzare l'estensione .cs invece del .txt predefinito, poiché il codice per il tuo programma verrà generato automaticamente. In tal caso, apri il file .tt e output extension .cs salvalo con .

Il file generato automaticamente dovrebbe ora avere un'estensione .cs. Il nome del file stesso è lo stesso del file .tt, quindi se vuoi cambiarlo, cambia il nome del file .tt.

Per il momento, scrivi qualcosa e invialo in un file generato automaticamente

In T4, il contenuto di ciò che scrivi viene fondamentalmente emesso così com'è. <# ... #> è il processo T4 e il resto è il testo di output effettivo.

Ad esempio, inseriamolo in un file .tt come segue.

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

Quando lo salvi, il file generato automaticamente dovrebbe essere emesso esattamente come lo hai scritto.

L'output è codice, quindi ovviamente può essere chiamato anche da Program.cs.

Prova a generare codice automaticamente

Come accennato in precedenza, ho confermato che ciò che ho scritto verrà prodotto così com'è, ma questo non è diverso da ciò che ho scritto normalmente. Ora, usiamo effettivamente lo script T4 per generare automaticamente il codice. Ci sono un'ampia varietà di modi per realizzarlo, quindi per favore fornisci solo una breve spiegazione qui, e poi ricrealo come vuoi farlo.

Questa volta, ad esempio, creiamo un metodo che aggiunge un metodo di analisi di ogni tipo a string e restituisce ParseXXXX il valore predefinito specificato se non può essere convertito. Questo è solo un esempio di creazione, quindi per favore aggiungilo se ritieni che ci siano parti che mancano.

Se riesci a capire C# senza spiegare i dettagli, sarà più veloce vederlo, quindi pubblicherò prima il codice 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;
  }
<# } #>
}

Quello che stiamo facendo è definire i tipi List per la prima volta da creare con , e poi girarli foreach con per generare quel numero di metodi. La parte di script di T4 è scritta in C#, quindi se capisci C#, dovresti essere in grado di capirlo.

Quando si esegue questa operazione, viene generato il codice seguente:

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

Ciò che viene generato è codice, quindi puoi usarlo nel tuo programma così com'è.

Un po' di più sul T4

Anche se la parte dello script T4 può essere scritta in C#, è necessario separare il codice C# T4 dal codice C# effettivamente generato. La parte che fa questa distinzione è <# .... #> . <# .... #> è il codice che viene eseguito come script, non il codice che viene effettivamente emesso nella parte di script di T4.

<# .... #> Il contenuto di C# stesso non viene spiegato perché è così com'è, ma <# .... #> esistono diversi tipi di frame. Ci sono i seguenti modi per utilizzare ciascuno di essi.

Spiegazione del codice
<#@ .... #> Viene utilizzato principalmente nella dichiarazione di varie intestazioni. Viene utilizzato all'inizio del codice T4 nella assembly dichiarazione di e import .
<# .... #> Scrivere il codice elaborato da T4. Può essere diviso in più righe. Tutto ciò che è descritto in questo intervallo funge solo da operazione e non influisce sul testo di output.
<#= .... #> Viene utilizzato quando si desidera restituire un valore, ad esempio una variabile, come risultato di output. string text = "Sample"; Ad esempio, se si scrive una variabile <#= text #> chiamata , verrà Sample restituita.
<#+ .... #> Utilizzato per definire classi e metodi. Fondamentalmente, è scritto alla fine del file T4.

Informazioni sull'editor T4

Se non si dispone di un'estensione in Visual Studio, l'apertura di un file .tt verrà visualizzata in testo in bianco e nero senza colore, che è piuttosto difficile da vedere.

Alcuni di essi possono visualizzare un'estensione per i file .tt in modo facile da leggere, quindi trova quello che ti piace. Poiché è realizzato da volontari, il contenuto può cambiare a seconda del periodo dell'anno e della versione di Visual Studio. Le estensioni possono essere aggiunte dal menu di Visual Studio in Estensioni.

Ecco cosa ho visto in Visual Studio 2022 con un'estensione chiamata "T4 Language".