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

Сторінка оновлюється :
Дата створення сторінки :

Робоче середовище

Візуальна студія
  • Visual Studio 2022
.МЕРЕЖІ
  • .NET 8.0
Вікна
  • Вікна 11

Передумови

Візуальна студія
  • Він працює навіть з дещо старішою версією
.МЕРЕЖІ
  • Він працює навіть з дещо старішою версією

На перших порах

Зазвичай, створюючи код, ви думаєте, що створите код, вводячи символи вручну, але якщо ви хочете створити код на основі коду або даних, які повинні бути створені за певним законом, зручно мати можливість їх автоматичної генерації. У цьому розділі описано, як використовувати Інструментарій перетворення текстового шаблону (T4) для автоматичної генерації коду.

Оскільки Т4 – це формат сценаріїв, то згенерувати код у Visual Studio одразу після створення файлу Т4 дуже просто. Написано, що він автоматично генерує код, але те, що генерується - це просто текст, тому крім програм можна генерувати що завгодно в текстовому форматі типу XML і JSON.

Основна мета цієї поради - пояснити кроки для фактичної автоматичної генерації коду в T4, тому я не буду детально вдаватися в подробиці T4. Якщо ви коли-небудь писали програму на C#, ви зрозумієте це відразу. Якщо ви хочете дізнатися більше про T4, будь ласка, перевірте офіційний сайт та інші сайти.

Передумовою

Ця порада передбачає наступне:

  • Visual Studio встановлено на Windows
  • Розуміння C#

T4 можна використовувати в більшості проектів, за винятком декількох, тому ви в основному вільні у виборі робочого навантаження під час встановлення.

Створити проект

Як згадувалося раніше, T4 можна використовувати в більшості проектів, за винятком декількох, тому не має значення, який тип проекту ви створюєте. У цьому випадку ми створюємо проєкт для консольного застосунку.

Створення файлу T4 (.tt)

Клацніть правою кнопкою миші файл або папку проекту, щоб додати новий елемент.

Натисніть кнопку «Переглянути всі шаблони».

Виберіть «Загальні» з дерева зліва та «Текстові шаблони» зі списку посередині. Ім'я файлу довільне.

Відразу після створення файлу ви можете побачити діалогове вікно, подібне до наведеного нижче. Це відображається під час автоматичної генерації файлу Т4. Файли T4 генеруються автоматично щоразу, коли файл зберігається або переглядається. Якщо ви хочете виконати процес автоматичної генерації як є, натисніть кнопку «ОК». Якщо ви не хочете, щоб діалогове вікно з'являлося щоразу, позначте пункт «Більше не показувати це повідомлення». Зверніть увагу, що якщо у файлі Т4 описано незаконний процес, як вказано в діалоговому вікні, він буде виконаний відповідним чином.

Додавши файл, ви побачите, що файл .tt було додано до Провідника рішень.

Зміст файлу виглядає наступним чином.

Якщо ви розпакуєте файл .tt у Провіднику рішень, ви побачите текстовий файл із таким самим іменем. Це і буде автоматично згенерований файл. Оскільки ми ще нічого не написали, вміст файлу порожній.

Перетворення автоматично створеного файлу на файл .cs

Якщо ви використовуєте T4, ви, швидше за все, захочете використовувати розширення .cs замість стандартного .txt, оскільки код для вашої програми буде згенеровано автоматично. У такому разі відкрийте файл .tt і збережіть його за допомогою файлу output extension .cs .

Тепер автоматично створений файл повинен мати розширення .cs. Саме ім'я файлу збігається з ім'ям файлу .tt, тому, якщо ви хочете його змінити, змініть ім'я файлу .tt.

Поки що запишіть щось і виведіть це в автоматично згенерований файл

У Т4 вміст того, що ви пишете, в основному виводиться як є. <# ... #> є процесом Т4, а решта є фактичним вихідним текстом.

Наприклад, давайте помістимо його у файл .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.

Спробуйте згенерувати код автоматично

Як вже говорилося вище, я підтвердив, що те, що я написав, буде виведено як є, але це нічим не відрізняється від того, що я написав нормально. Тепер давайте фактично використаємо скрипт Т4 для автоматичної генерації коду. Існує велика різноманітність способів його виготовлення, тому, будь ласка, дайте тут лише коротке пояснення, а потім переробіть його так, як ви хочете його зробити.

Цього разу, як приклад, створимо метод, який додає метод аналізу кожного типу до рядка та повертає 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;
  }
}

Те, що генерується, є кодом, тому ви можете використовувати його у своїй програмі як є.

Ще трохи про Т4

Незважаючи на те, що частина сценарію T4 може бути написана на C#, необхідно відокремити код T4 C# від коду C#, який насправді генерується. Частина, яка робить це розрізнення, це <# .... #> . <# .... #> це код, який виконується як скрипт, а не код, який насправді виводиться в скриптовій частині T4.

<# .... #> Вміст самого C# не пояснюється, тому що він є таким, як є, але <# .... #> є кілька типів фреймів. Існують наступні способи використання кожного з них.

Пояснення до коду
<#@ .... #> В основному він використовується при оголошенні різних заголовків. Він використовується на початку коду Т4 в оголошенні assembly та import .
<# .... #> Напишіть код, який обробляється Т4. Його можна розділити на кілька ліній. Все, що описано в цьому діапазоні, діє лише як операція і не впливає на вихідний текст.
<#= .... #> Це використовується, коли ви хочете вивести таке значення, як змінну, як результат виведення. string text = "Sample"; Наприклад, якщо записати змінну <#= text #> під назвою , буде Sample виведено.
<#+ .... #> Використовується для визначення класів і методів. В основному, він записується в кінці файлу Т4.

Про редактор Т4

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

Деякі з них можуть відображати розширення для файлів .tt у зручному для читання вигляді, тому знайдіть те, що вам подобається. Оскільки його роблять волонтери, контент може змінюватися в залежності від пори року та версії Visual Studio. Розширення можна додавати з меню Visual Studio в розділі «Розширення».

Ось що я побачив у Visual Studio 2022 з розширенням під назвою "Мова Т4".