Usar o Visual Studio e o Kit de Ferramentas de Transformação de Modelo de Texto (T4) para gerar código automaticamente

Página atualizada :
Data de criação de página :

Ambiente operacional

Visual Studio
  • Visual Studio 2022
.REDE
  • .NET 8.0
Windows
  • janelas 11

Pré-requisitos

Visual Studio
  • Funciona mesmo com uma versão um pouco mais antiga
.REDE
  • Funciona mesmo com uma versão um pouco mais antiga

Inicialmente

Normalmente, ao criar um código, você pensa que criará um código digitando caracteres manualmente, mas se quiser criar um código com base em código ou dados que precisam ser criados por uma lei específica, é conveniente poder gerá-lo automaticamente. Esta seção descreve como usar o Kit de Ferramentas de Transformação de Modelo de Texto (T4) para gerar código automaticamente.

Como o T4 é um formato de script, é muito fácil gerar código no Visual Studio imediatamente após a criação de um arquivo T4. Está escrito que ele gera código automaticamente, mas o que é gerado é apenas texto, então é possível gerar qualquer coisa em formato de texto como XML e JSON além de programas.

O principal objetivo desta dica é explicar as etapas para realmente gerar código automaticamente no T4, portanto, não entrarei em detalhes do T4 em detalhes. Se você já escreveu um programa em C#, você o entenderá imediatamente. Se você quiser saber mais sobre o T4, consulte o site oficial e outros sites.

pré-condição

Esta dica pressupõe o seguinte:

  • Visual Studio instalado no Windows
  • Noções básicas sobre C#

O T4 pode ser usado na maioria dos projetos, com exceção de alguns, portanto, você é basicamente livre para escolher sua carga de trabalho durante a instalação.

Criar um projeto

Como mencionado anteriormente, o T4 pode ser usado na maioria dos projetos, com exceção de alguns, portanto, não importa o tipo de projeto que você cria. Nesse caso, estamos criando um projeto para um aplicativo de console.

Criar um arquivo T4 (.tt)

Clique com o botão direito do mouse em um arquivo ou pasta de projeto para adicionar um novo item.

Clique no botão Exibir todos os modelos.

Selecione "Geral" na árvore à esquerda e "Modelos de texto" na lista no meio. O nome do arquivo é arbitrário.

Imediatamente após criar o arquivo, você pode ver uma caixa de diálogo semelhante à abaixo. Isso é exibido quando o arquivo T4 é gerado automaticamente. Os arquivos T4 são gerados automaticamente cada vez que o arquivo é salvo ou visualizado. Se você deseja executar o processo de geração automática como está, clique no botão "OK". Se você não quiser que a caixa de diálogo apareça todas as vezes, marque "Não mostrar esta mensagem novamente". Observe que, se um processo ilegal for descrito no arquivo T4 conforme indicado na caixa de diálogo, ele será executado de acordo.

Depois de adicionar o arquivo, você pode ver que o arquivo .tt foi adicionado ao Gerenciador de Soluções.

O conteúdo do arquivo é o seguinte.

Se você extrair o arquivo .tt no Gerenciador de Soluções, verá um arquivo de texto com o mesmo nome. Este será o arquivo gerado automaticamente. Como ainda não escrevemos nada, o conteúdo do arquivo está vazio.

Transformar um arquivo gerado automaticamente em um arquivo .cs

Se você estiver usando o T4, provavelmente desejará usar a extensão .cs em vez do .txt padrão, pois o código do seu programa será gerado automaticamente. Nesse caso, abra o arquivo .tt e output extension .cs salve-o com .

O arquivo gerado automaticamente agora deve ter uma extensão .cs. O nome do arquivo em si é o mesmo do arquivo .tt, portanto, se você quiser alterá-lo, altere o nome do arquivo .tt.

Por enquanto, escreva algo e envie para um arquivo gerado automaticamente

No T4, o conteúdo do que você escreve é basicamente gerado como está. <# ... #> é o processo T4 e o resto é o texto de saída real.

Por exemplo, vamos colocá-lo em um arquivo .tt da seguinte maneira.

<#@ 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 você o salva, o arquivo gerado automaticamente deve ser exibido exatamente como você o escreveu.

A saída é código, então é claro que também pode ser chamada a partir de Program.cs.

Tente gerar código automaticamente

Como mencionado acima, confirmei que o que escrevi será produzido como está, mas isso não é diferente do que escrevi normalmente. Agora, vamos realmente usar o script T4 para gerar automaticamente o código. Há uma grande variedade de maneiras de fazê-lo, então, por favor, dê apenas uma breve explicação aqui e, em seguida, refaça-o como quiser.

Desta vez, como exemplo, vamos criar um método que adiciona um método de análise de cada tipo à string e retorna ParseXXXX o valor padrão especificado se ele não puder ser convertido. Este é apenas um exemplo de criação, portanto, adicione-o se achar que há alguma parte que está faltando.

Se você puder entender C# sem explicar os detalhes, será mais rápido vê-lo, então postarei o código completo primeiro.

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

O que estamos fazendo é definir os tipos List pela primeira vez a serem criados com , e depois transformá-los foreach para gerar esse número de métodos. A parte do script do T4 é escrita em C#, portanto, se você entender C#, deverá ser capaz de entendê-la.

Quando você faz isso, o seguinte código é gerado:

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

O que é gerado é o código, então você pode usá-lo em seu programa como está.

Um pouco mais sobre o T4

Embora a parte do script T4 possa ser escrita em C#, é necessário separar o código C# T4 do código C# que é realmente gerado. A parte que faz essa distinção é <# .... #> . <# .... #> é o código que é executado como um script, não o código que é realmente gerado na parte do script do T4.

<# .... #> O conteúdo do C# em si não é explicado porque é como é, mas <# .... #> há vários tipos de quadros. Existem as seguintes maneiras de usar cada um.

Explicação do código
<#@ .... #> É usado principalmente na declaração de vários cabeçalhos. É usado no início do código T4 na assembly declaração de e import .
<# .... #> Escreva o código que é processado por T4. Pode ser dividido em várias linhas. Qualquer coisa descrita neste intervalo atua apenas como uma operação e não afeta o texto de saída.
<#= .... #> Isso é usado quando você deseja gerar um valor, como uma variável, como um resultado de saída. string text = "Sample"; Por exemplo, se você escrever uma variável <#= text #> chamada , será Sample gerada.
<#+ .... #> Usado para definir classes e métodos. Basicamente, ele é escrito no final do arquivo T4.

Sobre o T4 Editor

Se você não tiver uma extensão no Visual Studio, a abertura de um arquivo .tt será exibida em texto preto e branco sem cor, o que é bastante difícil de ver.

Alguns deles podem exibir uma extensão para arquivos .tt de maneira fácil de ler, portanto, encontre o que você gosta. Por ser feito por voluntários, o conteúdo pode mudar dependendo da época do ano e da versão do Visual Studio. As extensões podem ser adicionadas no menu do Visual Studio em Extensões.

Aqui está o que vi no Visual Studio 2022 com uma extensão chamada "T4 Language".