Použití sady Visual Studio a sady nástrojů pro transformaci textových šablon (T4) k automatickému generování kódu

Stránky aktualizovány :
Datum vytvoření stránky :

Provozní prostředí

Visual Studio
  • Visual Studio 2022
.SÍŤ
  • .NET 8.0
Windows
  • Systém Windows 11

Požadavky

Visual Studio
  • Funguje to i s poněkud starší verzí
.SÍŤ
  • Funguje to i s poněkud starší verzí

Nejprve

Za normálních okolností si při vytváření kódu myslíte, že kód vytvoříte ručním zadáním znaků, ale pokud chcete vytvořit kód založený na kódu nebo datech, které je třeba vytvořit podle konkrétního zákona, je vhodné mít možnost jej automaticky vygenerovat. Tato část popisuje, jak používat sadu nástrojů pro transformaci textové šablony (T4) k automatickému generování kódu.

Vzhledem k tomu, že T4 je skriptovací formát, je velmi snadné generovat kód v Visual Studio ihned po vytvoření souboru T4. Je psáno, že automaticky generuje kód, ale to, co se generuje, je pouze text, takže je možné kromě programů generovat cokoli v textovém formátu jako je XML a JSON.

Hlavním účelem tohoto tipu je vysvětlit kroky ke skutečnému automatickému generování kódu v T4, takže nebudu zacházet do detailů T4 do hloubky. Pokud jste někdy psali program v C#, hned to pochopíte. Pokud se chcete o T4 dozvědět více, podívejte se na oficiální webové stránky a další stránky.

předpoklad

Tento tip předpokládá následující:

  • Visual Studio nainstalované ve Windows
  • Porozumění jazyku C#

T4 lze použít ve většině projektů, s výjimkou několika, takže si během instalace můžete v podstatě vybrat pracovní zátěž.

Vytvoření projektu

Jak již bylo zmíněno dříve, T4 lze použít ve většině projektů, s výjimkou několika, takže nezáleží na tom, jaký typ projektu vytvoříte. V tomto případě vytváříme projekt pro konzolovou aplikaci.

Vytvoření souboru T4 (.tt)

Klikněte pravým tlačítkem myši na soubor nebo složku projektu a přidejte novou položku.

Klikněte na tlačítko Zobrazit všechny šablony.

Ze stromu vlevo vyberte "Obecné" a ze seznamu uprostřed vyberte "Textové šablony". Název souboru je libovolný.

Ihned po vytvoření souboru se může zobrazit dialogové okno podobné tomu níže. Zobrazí se, když je soubor T4 automaticky vygenerován. Soubory T4 se automaticky generují při každém uložení nebo zobrazení souboru. Pokud chcete provést proces automatického generování tak, jak je, klikněte na tlačítko "OK". Pokud nechcete, aby se dialogové okno zobrazovalo pokaždé, zaškrtněte políčko "Tuto zprávu již příště nezobrazovat". Vezměte prosím na vědomí, že pokud je v souboru T4 popsán nelegální proces, jak je uvedeno v dialogu, bude odpovídajícím způsobem proveden.

Po přidání souboru uvidíte, že soubor .tt byl přidán do Průzkumník řešení.

Obsah souboru je následující.

Pokud extrahujete soubor .tt v Průzkumník řešení, zobrazí se textový soubor se stejným názvem. Toto bude automaticky vygenerovaný soubor. Vzhledem k tomu, že jsme ještě nic nenapsali, je obsah souboru prázdný.

Nastavení automaticky generovaného souboru jako souboru .cs

Pokud používáte T4, budete s největší pravděpodobností chtít místo výchozího .txt použít rozšíření .cs, protože kód pro váš program se automaticky vygeneruje. V takovém případě otevřete soubor .tt a output extension .cs uložte jej pomocí programu .

Automaticky vygenerovaný soubor by nyní měl mít příponu .cs. Samotný název souboru je stejný jako název souboru .tt, takže pokud jej chcete změnit, změňte název souboru .tt.

Prozatím něco napište a vypište to do automaticky vygenerovaného souboru

V T4 je obsah toho, co píšete, v podstatě výstup tak, jak je. <# ... #> je proces T4 a zbytek je skutečný výstupní text.

Umístíme ho například do souboru .tt následujícím způsobem.

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

Když ho uložíte, automaticky vygenerovaný soubor by se měl vytisknout přesně tak, jak jste ho napsali.

Výstupem je kód, takže jej lze samozřejmě volat i z Program.cs.

Pokuste se generovat kód automaticky

Jak již bylo zmíněno výše, potvrdil jsem, že to, co jsem napsal, bude vydáno tak, jak to je, ale to se neliší od toho, co jsem napsal normálně. Nyní skutečně použijeme skript T4 k automatickému vygenerování kódu. Existuje široká škála způsobů, jak to udělat, takže zde prosím uveďte pouze stručné vysvětlení a poté to předělejte, jak to chcete udělat.

Tentokrát jako příklad vytvoříme metodu, která přidá metodu parse každého typu do řetězce a vrátí ParseXXXX zadanou výchozí hodnotu, pokud ji nelze převést. Toto je jen příklad tvorby, takže jej prosím přidejte, pokud máte pocit, že tam jsou nějaké části, které chybí.

Pokud dokážete porozumět C# bez vysvětlování podrobností, bude rychlejší to vidět, takže nejprve zveřejním celý kód.

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

To, co děláme, je definování typů List , které mají být vytvořeny pomocí , a pak je foreach otočíme, abychom vygenerovali tento počet metod. Skriptová část T4 je napsána v jazyce C#, takže pokud rozumíte C#, měli byste být schopni mu porozumět.

Když to uděláte, vygeneruje se následující kód:

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

To, co je generováno, je kód, takže jej můžete použít ve svém programu tak, jak je.

Něco více o T4

I když část skriptu T4 může být napsána v jazyce C#, je nutné oddělit kód T4 C# od kódu jazyka C#, který je skutečně vygenerován. Část, která tento rozdíl dělá, je <# .... #> . <# .... #> je kód, který je spuštěn jako skript, nikoli kód, který je ve skutečnosti výstupem v části skriptu T4.

<# .... #> Samotný obsah jazyka C# není vysvětlen, protože je takový, jaký je, ale <# .... #> existuje několik typů rámců. Existují následující způsoby, jak každý z nich použít.

Vysvětlení kódu
<#@ .... #> Používá se hlavně při deklaraci různých hlaviček. Používá se na začátku kódu T4 v assembly deklaraci a import .
<# .... #> Napište kód, který je zpracován nástrojem T4. Lze jej rozdělit do více řádků. Cokoli popsané v tomto rozsahu funguje pouze jako operace a nemá vliv na výstupní text.
<#= .... #> Používá se, když chcete jako výstupní výsledek vypsat hodnotu, jako je proměnná. string text = "Sample"; Pokud například napíšete proměnnou <#= text #> s názvem , bude Sample výstupem.
<#+ .... #> Používá se k definování tříd a metod. V podstatě se zapisuje na konec souboru T4.

O editoru T4

Pokud nemáte příponu v Visual Studio, otevření souboru .tt se zobrazí černobílým textem bez barvy, což je poměrně obtížné vidět.

Některé z nich mohou zobrazovat příponu pro soubory .tt snadno čitelným způsobem, takže si najděte tu, která se vám líbí. Vzhledem k tomu, že jej vytvářejí dobrovolníci, může se obsah měnit v závislosti na ročním období a verzi sady Visual Studio. Rozšíření je možné přidat z nabídky sady Visual Studio v části Rozšíření.

Tady je to, co jsem viděl ve Visual Studio 2022 s rozšířením s názvem "Jazyk T4".