Использование Visual Studio и набора средств преобразования текстовых шаблонов (T4) для автоматического создания кода
Операционная среда
- Визуальная студия
-
- Визуальная студия 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 автоматически генерируются при каждом сохранении или просмотре файла. Если вы хотите выполнить процесс автоматической генерации как есть, нажмите кнопку «ОК». Если вы не хотите, чтобы диалоговое окно появлялось каждый раз, установите флажок «Больше не показывать это сообщение». Обратите внимание, что если в файле T4 описан незаконный процесс, как указано в диалоговом окне, он будет выполнен соответствующим образом.
После добавления файла вы увидите, что файл .tt был добавлен в обозреватель решений.
Содержимое файла выглядит следующим образом.
Если вы извлечете файл .tt в обозревателе решений, вы увидите текстовый файл с тем же именем. Это будет автоматически сгенерированный файл. Так как мы еще ничего не написали, содержимое файла пустое.
Превращение автоматически созданного файла в файл .cs
Если вы используете T4, вы, скорее всего, захотите использовать расширение .cs вместо .txt по умолчанию, так как код для вашей программы будет сгенерирован автоматически.
В этом случае откройте файл .tt и output
extension
.cs
сохраните его с помощью .
Теперь автоматически сгенерированный файл должен иметь .cs расширение. Само имя файла совпадает с именем файла .tt, поэтому, если вы хотите его изменить, измените имя файла .tt.
А пока напиши что-нибудь и выведи это в автоматически сгенерированный файл
В T4 содержимое того, что вы пишете, в основном выводится как есть.
<# ... #>
— это процесс 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 для автоматической генерации кода. Существует большое разнообразие способов его изготовления, поэтому, пожалуйста, дайте здесь только краткое объяснение, а затем переделайте его так, как вы хотите его сделать.
На этот раз в качестве примера создадим метод, который добавляет в строку метод разбора каждого типа и возвращает 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".