Utiliser Visual Studio et la boîte à outils de transformation de modèle de texte (T4) pour générer automatiquement du code

Page mise à jour :
Date de création de la page :

Environnement d’exploitation

Studio visuel
  • Visual Studio 2022
.FILET
  • .NET 8.0
Windows
  • Windows 11

Conditions préalables

Studio visuel
  • Cela fonctionne même avec une version un peu plus ancienne
.FILET
  • Cela fonctionne même avec une version un peu plus ancienne

Au début

Normalement, lors de la création d’un code, vous pensez que vous allez créer un code en tapant des caractères manuellement, mais si vous souhaitez créer un code basé sur du code ou des données qui doivent être créées par une loi spécifique, il est pratique de pouvoir le générer automatiquement. Cette section décrit comment utiliser le kit de transformation de modèle de texte (T4) pour générer automatiquement du code.

Étant donné que T4 est un format de script, il est très facile de générer du code dans Visual Studio immédiatement après la création d’un fichier T4. Il est écrit qu’il génère automatiquement du code, mais ce qui est généré n’est que du texte, il est donc possible de générer n’importe quoi au format texte tel que XML et JSON en plus des programmes.

L’objectif principal de cette astuce est d’expliquer les étapes pour générer automatiquement du code dans T4, je n’entrerai donc pas dans les détails de T4 en profondeur. Si vous avez déjà écrit un programme en C#, vous le comprendrez tout de suite. Si vous souhaitez en savoir plus sur T4, veuillez consulter le site officiel et d’autres sites.

condition préalable

Cette astuce suppose ce qui suit :

  • Visual Studio installé sur Windows
  • Compréhension de C#

T4 peut être utilisé dans la plupart des projets, à l’exception de quelques-uns, vous êtes donc fondamentalement libre de choisir votre charge de travail lors de l’installation.

Créer un projet

Comme mentionné précédemment, T4 peut être utilisé dans la plupart des projets, à l’exception de quelques-uns, donc peu importe le type de projet que vous créez. Dans ce cas, nous créons un projet pour une application console.

Créer un fichier T4 (.tt)

Cliquez avec le bouton droit de la souris sur un fichier ou un dossier de projet pour ajouter un nouvel élément.

Cliquez sur le bouton Afficher tous les modèles.

Sélectionnez « Général » dans l’arborescence de gauche, et « Modèles de texte » dans la liste du milieu. Le nom du fichier est arbitraire.

Immédiatement après la création du fichier, vous pouvez voir une boîte de dialogue similaire à celle ci-dessous. Celui-ci s’affiche lorsque le fichier T4 est généré automatiquement. Les fichiers T4 sont générés automatiquement chaque fois qu’ils sont sauvegardés ou consultés. Si vous souhaitez effectuer le processus de génération automatique tel quel, cliquez sur le bouton « OK ». Si vous ne souhaitez pas que la boîte de dialogue apparaisse à chaque fois, cochez « Ne plus afficher ce message ». Veuillez noter que si un processus illégal est décrit dans le fichier T4 comme indiqué dans la boîte de dialogue, il sera exécuté en conséquence.

Une fois que vous avez ajouté le fichier, vous pouvez voir que le fichier .tt a été ajouté à l’Explorateur de solutions.

Le contenu du fichier est le suivant.

Si vous extrayez le fichier .tt dans l’Explorateur de solutions, vous verrez un fichier texte portant le même nom. Il s’agit du fichier généré automatiquement. Comme nous n’avons encore rien écrit, le contenu du fichier est vide.

Transformer un fichier généré automatiquement en fichier .cs

Si vous utilisez T4, vous voudrez probablement utiliser l’extension .cs au lieu de l’extension .txt par défaut, car le code de votre programme sera généré automatiquement. Dans ce cas, ouvrez le fichier .tt et output extension .cs enregistrez-le avec .

Le fichier généré automatiquement doit maintenant avoir une extension .cs. Le nom du fichier lui-même est le même que celui du fichier .tt, donc si vous souhaitez le modifier, modifiez le nom du fichier .tt.

Pour l’instant, écrivez quelque chose et sortez-le dans un fichier généré automatiquement

En T4, le contenu de ce que vous écrivez est essentiellement affiché tel quel. <# ... #> est le processus T4, et le reste est le texte de sortie réel.

Par exemple, mettons-le dans un fichier .tt comme suit.

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

Lorsque vous l’enregistrez, le fichier généré automatiquement doit s’afficher exactement comme vous l’avez écrit.

La sortie est du code, donc bien sûr, elle peut aussi être appelée à partir de Program.cs.

Essayez de générer du code automatiquement

Comme mentionné ci-dessus, j’ai confirmé que ce que j’ai écrit sera publié tel quel, mais ce n’est pas différent de ce que j’ai écrit normalement. Maintenant, utilisons le script T4 pour générer automatiquement le code. Il existe une grande variété de façons de le faire, alors ne donnez qu’une brève explication ici, puis refaites-le comme vous le souhaitez.

Cette fois, à titre d’exemple, créons une méthode qui ajoute une méthode parse de chaque type à la chaîne et renvoie ParseXXXX la valeur par défaut spécifiée si elle ne peut pas être convertie. Ceci n’est qu’un exemple de création, alors ajoutez-le si vous pensez qu’il y a des parties qui manquent.

Si vous pouvez comprendre C# sans expliquer les détails, il sera plus rapide de le voir, donc je vais d’abord publier le code 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;
  }
<# } #>
}

Ce que nous faisons, c’est définir les types List pour la première fois à créer avec , puis les retourner foreach avec pour générer ce nombre de méthodes. La partie script de T4 est écrite en C#, donc si vous comprenez C#, vous devriez être capable de le comprendre.

Lorsque vous effectuez cette opération, le code suivant est généré :

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

Ce qui est généré est du code, vous pouvez donc l’utiliser tel quel dans votre programme.

Un peu plus sur le T4

Même si la partie script T4 peut être écrite en C#, il est nécessaire de séparer le code C# T4 du code C# qui est réellement généré. La partie qui fait cette distinction est <# .... #> . <# .... #> est le code qui est exécuté en tant que script, et non le code qui est réellement affiché dans la partie script de T4.

<# .... #> Le contenu de C# lui-même n’est pas expliqué car il est tel quel, mais <# .... #> il existe plusieurs types de cadres. Il existe les façons suivantes d’utiliser chacun.

Explication du code
<#@ .... #> Il est principalement utilisé dans la déclaration de divers en-têtes. Il est utilisé au début du code T4 dans la assembly déclaration de et import .
<# .... #> Écrire le code traité par T4. Il peut être divisé en plusieurs lignes. Tout ce qui est décrit dans cette plage n’agit que comme une opération et n’affecte pas le texte de sortie.
<#= .... #> Cette option est utilisée lorsque vous souhaitez générer une valeur telle qu’une variable en tant que résultat de sortie. string text = "Sample"; Par exemple, si vous écrivez une variable <#= text #> appelée , sera Sample affichée.
<#+ .... #> Utilisé pour définir des classes et des méthodes. En gros, il est écrit à la fin du fichier T4.

À propos de l’éditeur T4

Si vous n’avez pas d’extension dans Visual Studio, l’ouverture d’un fichier .tt s’affichera en noir et blanc sans couleur, ce qui est plutôt difficile à voir.

Certains d’entre eux peuvent afficher une extension pour les fichiers .tt d’une manière facile à lire, alors veuillez trouver celle que vous aimez. Comme il est réalisé par des bénévoles, le contenu peut changer en fonction de la période de l’année et de la version de Visual Studio. Les extensions peuvent être ajoutées à partir du menu Visual Studio sous Extensions.

Voici ce que j’ai vu dans Visual Studio 2022 avec une extension appelée « Langage T4 ».