Automatyczne generowanie kodu przy użyciu programu Visual Studio i zestawu narzędzi do przekształcania szablonów tekstowych (T4)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko pracy

Visual Studio
  • informacji o wersji Visual Studio 2022
.SIEĆ
  • .NET 8.0
Windows
  • Okna 11

Warunki wstępne

Visual Studio
  • Działa nawet z nieco starszą wersją
.SIEĆ
  • Działa nawet z nieco starszą wersją

Na początku

Zwykle tworząc kod, myślisz, że utworzysz kod, wpisując znaki ręcznie, ale jeśli chcesz stworzyć kod na podstawie kodu lub danych, które muszą zostać utworzone przez określone prawo, wygodnie jest mieć możliwość automatycznego wygenerowania go. W tej sekcji opisano, jak używać zestawu narzędzi do przekształcania szablonów tekstowych (T4) do automatycznego generowania kodu.

Ponieważ T4 jest formatem skryptowym, bardzo łatwo jest wygenerować kod w programie Visual Studio natychmiast po utworzeniu pliku T4. Jest napisane, że automatycznie generuje kod, ale to, co jest generowane, to tylko tekst, więc oprócz programów można wygenerować wszystko w formacie tekstowym, takim jak XML i JSON.

Głównym celem tej wskazówki jest wyjaśnienie kroków, które należy wykonać, aby faktycznie automatycznie wygenerować kod w T4, więc nie będę zagłębiał się w szczegóły T4. Jeśli kiedykolwiek pisałeś program w języku C#, zrozumiesz go od razu. Jeśli chcesz dowiedzieć się więcej o T4, sprawdź oficjalną stronę internetową i inne strony.

Warunek wstępny

W tej wskazówce założono, że:

  • Program Visual Studio zainstalowany w systemie Windows
  • Zrozumienie języka C#

T4 może być używany w większości projektów, z wyjątkiem kilku, więc w zasadzie możesz wybrać obciążenie podczas instalacji.

Tworzenie projektu

Jak wspomniano wcześniej, T4 może być używany w większości projektów, z wyjątkiem kilku, więc nie ma znaczenia, jaki typ projektu tworzysz. W tym przypadku tworzymy projekt dla aplikacji konsolowej.

Tworzenie pliku T4 (.tt)

Kliknij prawym przyciskiem myszy plik lub folder projektu, aby dodać nowy element.

Kliknij przycisk Wyświetl wszystkie szablony.

Wybierz "Ogólne" z drzewa po lewej stronie i "Szablony tekstowe" z listy pośrodku. Nazwa pliku jest dowolna.

Natychmiast po utworzeniu pliku może zostać wyświetlone okno dialogowe podobne do poniższego. Jest on wyświetlany, gdy plik T4 jest generowany automatycznie. Pliki T4 są generowane automatycznie za każdym razem, gdy plik jest zapisywany lub wyświetlany. Jeśli chcesz przeprowadzić proces automatycznego generowania w takiej postaci, w jakiej jest, kliknij przycisk "OK". Jeśli nie chcesz, aby okno dialogowe pojawiało się za każdym razem, zaznacz opcję "Nie pokazuj więcej tego komunikatu". Należy pamiętać, że jeśli w pliku T4 jest opisany nielegalny proces, jak podano w oknie dialogowym, zostanie on odpowiednio wykonany.

Po dodaniu pliku widać, że plik tt został dodany do Eksplorator rozwiązań.

Zawartość pliku jest następująca.

Jeśli wyodrębnisz plik tt w Eksplorator rozwiązań, zobaczysz plik tekstowy o tej samej nazwie. Będzie to plik wygenerowany automatycznie. Ponieważ jeszcze nic nie napisaliśmy, zawartość pliku jest pusta.

Ustawianie automatycznie wygenerowanego pliku jako pliku .cs

Jeśli używasz T4, najprawdopodobniej będziesz chciał użyć rozszerzenia .cs zamiast domyślnego .txt, ponieważ kod Twojego programu zostanie wygenerowany automatycznie. W takim przypadku otwórz plik .tt i output extension .cs zapisz go za pomocą .

Automatycznie wygenerowany plik powinien mieć teraz .cs rozszerzenie. Sama nazwa pliku jest taka sama jak plik .tt, więc jeśli chcesz ją zmienić, zmień nazwę pliku .tt.

Na razie napisz coś i wyprowadź to do automatycznie wygenerowanego pliku

W T4 treść tego, co piszesz, jest w zasadzie wyprowadzana tak, jak jest. <# ... #> to proces T4, a reszta to rzeczywisty tekst wyjściowy.

Na przykład umieśćmy go w pliku .tt w następujący sposób.

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

Po zapisaniu automatycznie wygenerowany plik powinien być wyświetlany dokładnie tak, jak go napisałeś.

Wyjściem jest kod, więc oczywiście można go również wywołać z Program.cs.

Spróbuj wygenerować kod automatycznie

Jak wspomniano powyżej, potwierdziłem, że to, co napisałem, zostanie wydrukowane tak, jak jest, ale nie różni się to od tego, co napisałem normalnie. Teraz użyjmy skryptu T4 do automatycznego generowania kodu. Istnieje wiele różnych sposobów, aby to zrobić, więc podaj tutaj tylko krótkie wyjaśnienie, a następnie przerób go tak, jak chcesz.

Tym razem, jako przykład, utwórzmy metodę, która dodaje metodę parsowania każdego typu do ciągu i zwraca ParseXXXX określoną wartość domyślną, jeśli nie można jej przekonwertować. To jest tylko przykład tworzenia, więc dodaj go, jeśli uważasz, że są jakieś części, których brakuje.

Jeśli potrafisz zrozumieć C# bez wyjaśniania szczegółów, szybciej będzie to zobaczyć, więc najpierw opublikuję pełny kod.

<#@ 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 robimy, to definiowanie typów List po raz pierwszy, które mają być tworzone za pomocą , a następnie obracanie ich foreach w celu wygenerowania tej liczby metod. Część skryptu T4 jest napisana w języku C#, więc jeśli rozumiesz język C#, powinieneś być w stanie go zrozumieć.

Po wykonaniu tej czynności zostanie wygenerowany następujący kod:

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 jest generowane, to kod, więc możesz go użyć w swoim programie w takiej postaci, w jakiej jest.

Trochę więcej o T4

Mimo że część skryptu T4 można napisać w języku C#, konieczne jest oddzielenie kodu T4 C# od kodu C#, który jest faktycznie generowany. Częścią, która czyni to rozróżnienie, jest <# .... #> . <# .... #> to kod, który jest wykonywany jako skrypt, a nie kod, który jest faktycznie wyprowadzany w części skryptu T4.

<# .... #> Sama zawartość języka C# nie jest wyjaśniona, ponieważ jest taka, jaka jest, ale <# .... #> istnieje kilka typów ramek. Istnieją następujące sposoby korzystania z każdego z nich.

Wyjaśnienie kodu
<#@ .... #> Jest używany głównie w deklaracji różnych nagłówków. Jest on używany na początku kodu T4 w zgłoszeniu assembly i import .
<# .... #> Napisz kod, który jest przetwarzany przez T4. Można go podzielić na wiele linii. Wszystko, co opisano w tym zakresie, działa tylko jako operacja i nie ma wpływu na tekst wyjściowy.
<#= .... #> Jest to używane, gdy chcesz wyprowadzić wartość, taką jak zmienna, jako wynik wyjściowy. string text = "Sample"; Na przykład, jeśli napiszesz zmienną <#= text #> o nazwie , zostanie Sample wyprowadzony.
<#+ .... #> Służy do definiowania klas i metod. Zasadniczo jest on zapisywany na końcu pliku T4.

Informacje o edytorze T4

Jeśli nie masz rozszerzenia w programie Visual Studio, otwarcie pliku tt zostanie wyświetlone w czarno-białym tekście bez koloru, co jest raczej trudne do zobaczenia.

Niektóre z nich mogą wyświetlać rozszerzenie dla plików .tt w łatwy do odczytania sposób, więc znajdź ten, który Ci się podoba. Ponieważ jest tworzony przez wolontariuszy, zawartość może się zmieniać w zależności od pory roku i wersji programu Visual Studio. Rozszerzenia można dodawać z menu programu Visual Studio w obszarze Rozszerzenia.

Oto, co zobaczyłem w programie Visual Studio 2022 z rozszerzeniem o nazwie "T4 Language".