Използвайте Visual Studio и инструментариума за трансформация на текстови шаблони (T4) за автоматично генериране на код

Страницата се актуализира :
Дата на създаване на страница :

Работна среда

Визуално студио
  • Visual Studio 2022
.НЕТЕН
  • .NET 8.0
Уиндоус
  • Windows 11

Предпоставки

Визуално студио
  • Работи дори с малко по-стара версия
.НЕТЕН
  • Работи дори с малко по-стара версия

Отначало

Обикновено, когато създавате код, си мислите, че ще създадете код, като въведете знаци ръчно, но ако искате да създадете код на базата на код или данни, които трябва да бъдат създадени от конкретен закон, е удобно да можете да го генерирате автоматично. Този раздел описва как да използвате инструментариума за трансформация на текстови шаблони (T4) за автоматично генериране на код.

Тъй като T4 е скриптов формат, е много лесно да генерирате код във Visual Studio веднага след създаването на T4 файл. Написано е, че автоматично генерира код, но това, което се генерира, е само текст, така че е възможно да се генерира всичко в текстов формат като XML и JSON в допълнение към програмите.

Основната цел на този съвет е да обясня стъпките за действително автоматично генериране на код в T4, така че няма да навлизам в подробности за T4 в дълбочина. Ако някога сте писали програма на C#, ще я разберете веднага. Ако искате да научите повече за Т4, моля, проверете официалния уебсайт и други сайтове.

Предпоставка

Този съвет предполага следното:

  • Visual Studio, инсталиран на Windows
  • Разбиране на C#

T4 може да се използва в повечето проекти, с изключение на няколко, така че по принцип сте свободни да избирате работното си натоварване по време на инсталацията.

Създаване на проект

Както споменахме по-рано, T4 може да се използва в повечето проекти, с изключение на няколко, така че няма значение какъв тип проект създавате. В този случай създаваме проект за конзолно приложение.

Създаване на файл T4 (.tt)

Щракнете с десния бутон върху файл или папка на проект, за да добавите нов елемент.

Щракнете върху бутона Преглед на всички шаблони.

Изберете "Общи" от дървото вляво и "Текстови шаблони" от списъка в средата. Името на файла е произволно.

Веднага след създаването на файла може да видите диалогов прозорец, подобен на този по-долу. Това се показва, когато файлът T4 се генерира автоматично. T4 файловете се генерират автоматично всеки път, когато файлът бъде запазен или прегледен. Ако искате да извършите процеса на автоматично генериране такъв, какъвто е, щракнете върху бутона "OK". Ако не искате диалоговият прозорец да се появява всеки път, поставете отметка "Не показвай това съобщение отново". Моля, имайте предвид, че ако в T4 файла е описан незаконен процес, както е посочено в диалоговия прозорец, той ще бъде изпълнен съответно.

След като добавите файла, можете да видите, че .tt файлът е добавен към Solution Explorer.

Съдържанието на файла е както следва.

Ако извлечете .tt файла в Solution Explorer, ще видите текстов файл със същото име. Това ще бъде автоматично генерираният файл. Тъй като все още не сме написали нищо, съдържанието на файла е празно.

Превръщане на автоматично генериран файл в .cs файл

Ако използвате T4, най-вероятно ще искате да използвате разширението .cs вместо .txt по подразбиране, тъй като кодът за вашата програма ще бъде генериран автоматично. В този случай отворете .tt файла и output extension .cs го запазете с .

Автоматично генерираният файл вече трябва да има разширение .cs. Самото име на файла е същото като на .tt файла, така че ако искате да го промените, променете името на .tt файла.

Засега напишете нещо и го изведете в автоматично генериран файл

В Т4 съдържанието на това, което пишете, е основно изведено такова, каквото е. <# ... #> е процесът T4, а останалото е действителният изходен текст.

Например, нека го поставим в .tt файл, както следва.

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

Когато го запишете, автоматично генерираният файл трябва да се изведе точно както сте го написали.

Изходът е код, така че разбира се може да бъде извикан и от Program.cs.

Опитайте се да генерирате код автоматично

Както споменах по-горе, потвърдих, че написаното от мен ще бъде изведено такова, каквото е, но това не е по-различно от това, което написах нормално. Сега нека всъщност използваме T4 скрипта за автоматично генериране на кода. Има голямо разнообразие от начини да го направите, така че, моля, дайте само кратко обяснение тук и след това го преработете, както искате да го направите.

Този път, като пример, нека създадем метод, който добавя метод за анализ от всеки тип към string и връща ParseXXXX зададената стойност по подразбиране, ако не може да бъде преобразувана. Това е само пример за създаване, така че моля, добавете го, ако смятате, че има някакви части, които липсват.

Ако можете да разберете C#, без да обяснявате подробностите, ще бъде по-бързо да го видите, така че първо ще публикувам пълния код.

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

Това, което правим, е да дефинираме типовете List за първи път, които трябва да бъдат създадени с , и след това да ги foreach превърнем, за да генерираме този брой методи. Скриптовата част на T4 е написана на C#, така че ако разбирате C#, трябва да можете да я разберете.

Когато направите това, се генерира следният код:

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

Това, което се генерира, е код, така че можете да го използвате във вашата програма такава, каквато е.

Малко повече за T4

Въпреки че частта за скрипта T4 може да бъде написана на C#, е необходимо да се отдели T4 C# кода от C# кода, който всъщност се генерира. Частта, която прави това разграничение, е <# .... #> . <# .... #> е кодът, който се изпълнява като скрипт, а не кодът, който всъщност се извежда в скриптовата част на T4.

<# .... #> Съдържанието на самия C# не е обяснено, защото е такова, каквото е, но <# .... #> има няколко вида рамки. Има следните начини за използване на всеки от тях.

Обяснение на кода
<#@ .... #> Използва се главно при декларирането на различни заглавки. Използва се в началото на кода T4 в декларацията assembly на и import .
<# .... #> Напишете код, който се обработва от T4. Може да се раздели на множество линии. Всичко, описано в този диапазон, действа само като операция и не влияе на изходния текст.
<#= .... #> Това се използва, когато искате да изведете стойност като променлива като изходен резултат. string text = "Sample"; Например, ако напишете променлива <#= text #> , наречена , ще бъде Sample изведена.
<#+ .... #> Използва се за дефиниране на класове и методи. По принцип той е написан в края на файла T4.

Относно редактора на T4

Ако нямате разширение във Visual Studio, отварянето на .tt файл ще се покаже в черно-бял текст без цвят, което е доста трудно да се види.

Някои от тях могат да показват разширение за .tt файлове по лесен за четене начин, така че моля, намерете този, който харесвате. Тъй като се прави от доброволци, съдържанието може да се променя в зависимост от времето на годината и версията на Visual Studio. Разширенията могат да се добавят от менюто на Visual Studio под Разширения.

Ето какво видях във Visual Studio 2022 с разширение, наречено "T4 Language".