Utilizați Visual Studio și Text Template Transformation Toolkit (T4) pentru a genera automat cod

Pagina actualizată :
Data creării paginii :

Mediu de operare

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 8.0
Windows
  • Ferestre 11

Cerințe preliminare

Visual Studio
  • Funcționează chiar și cu o versiune ceva mai veche
.NET
  • Funcționează chiar și cu o versiune ceva mai veche

La început

În mod normal, atunci când creați un cod, credeți că veți crea un cod tastând manual caracterele, dar dacă doriți să creați un cod bazat pe cod sau date care trebuie create de o anumită lege, este convenabil să îl puteți genera automat. Această secțiune descrie modul de utilizare a setului de instrumente pentru transformarea șablonului de text (T4) pentru a genera automat cod.

Deoarece T4 este un format de scripting, este foarte ușor să generați cod în Visual Studio imediat după crearea unui fișier T4. Este scris că generează automat cod, dar ceea ce este generat este doar text, deci este posibil să generați orice în format text, cum ar fi XML și JSON, pe lângă programe.

Scopul principal al acestui sfat este de a explica pașii pentru a genera automat cod în T4, așa că nu voi intra în detaliile T4 în profunzime. Dacă ați scris vreodată un program în C #, îl veți înțelege imediat. Dacă doriți să aflați mai multe despre T4, vă rugăm să verificați site-ul oficial și alte site-uri.

Condiție prealabilă

Acest sfat presupune următoarele:

  • Visual Studio instalat pe Windows
  • Înțelegerea C#

T4 poate fi utilizat în majoritatea proiectelor, cu excepția câtorva, astfel încât sunteți practic liber să alegeți volumul de lucru în timpul instalării.

Crearea unui proiect

După cum am menționat mai devreme, T4 poate fi utilizat în majoritatea proiectelor, cu excepția câtorva, deci nu contează ce tip de proiect creați. În acest caz, creăm un proiect pentru o aplicație consolă.

Crearea unui fișier T4 (.tt)

Faceți clic dreapta pe un fișier sau folder de proiect pentru a adăuga un element nou.

Faceți clic pe butonul Vizualizare globală șabloane.

Selectați "General" din arborele din stânga și "Șabloane text" din lista din mijloc. Numele fișierului este arbitrar.

Imediat după crearea fișierului, este posibil să vedeți un dialog similar cu cel de mai jos. Aceasta se afișează atunci când fișierul T4 este generat automat. Fișierele T4 sunt generate automat de fiecare dată când fișierul este salvat sau vizualizat. Dacă doriți să efectuați procesul de generare automată așa cum este, faceți clic pe butonul "OK". Dacă nu doriți ca dialogul să apară de fiecare dată, bifați "Nu mai afișați acest mesaj". Vă rugăm să rețineți că, dacă un proces ilegal este descris în fișierul T4, așa cum se menționează în dialog, acesta va fi executat în consecință.

După ce adăugați fișierul, puteți vedea că fișierul .tt a fost adăugat la Exploratorul de soluții.

Conținutul fișierului este următorul.

Dacă extrageți fișierul .tt în Exploratorul de soluții, veți vedea un fișier text cu același nume. Acesta va fi fișierul generat automat. Deoarece nu am scris încă nimic, conținutul fișierului este gol.

Transformarea unui fișier generat automat într-un fișier .cs

Dacă utilizați T4, cel mai probabil veți dori să utilizați extensia .cs în locul .txt implicit, deoarece codul pentru program va fi generat automat. În acest caz, deschideți fișierul .tt și output extension .cs salvați-l cu .

Fișierul generat automat ar trebui să aibă acum o extensie .cs. Numele fișierului în sine este același cu fișierul .tt, deci dacă doriți să îl modificați, schimbați numele fișierului .tt.

Pentru moment, scrieți ceva și scoateți-l într-un fișier generat automat

În T4, conținutul a ceea ce scrieți este practic rezultatul așa cum este. <# ... #> este procesul T4, iar restul este textul de ieșire real.

De exemplu, să-l punem într-un fișier .tt după cum urmează.

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

Când îl salvați, fișierul generat automat ar trebui să fie afișat exact așa cum l-ați scris.

Rezultatul este codul, deci, desigur, poate fi apelat și din Program.cs.

Încercați să generați automat codul

După cum am menționat mai sus, am confirmat că ceea ce am scris va fi rezultatul așa cum este, dar acest lucru nu este diferit de ceea ce am scris în mod normal. Acum, să folosim scriptul T4 pentru a genera automat codul. Există o mare varietate de moduri de a face acest lucru, așa că vă rugăm să oferiți doar o scurtă explicație aici și apoi să îl refaceți așa cum doriți să îl faceți.

De data aceasta, de exemplu, să creăm o metodă care adaugă o metodă de analiză a fiecărui tip la șir și returnează ParseXXXX valoarea implicită specificată dacă nu poate fi convertită. Acesta este doar un exemplu de creație, așa că vă rugăm să-l adăugați dacă simțiți că există părți care lipsesc.

Dacă puteți înțelege C# fără a explica detaliile, va fi mai rapid să-l vedeți, așa că voi posta mai întâi codul complet.

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

Ceea ce facem este să definim tipurile List pentru prima dată care urmează să fie create cu , și apoi să le transformăm foreach pentru a genera acel număr de metode. Partea de script a T4 este scrisă în C#, deci dacă înțelegeți C#, ar trebui să o puteți înțelege.

Când faceți acest lucru, se generează următorul cod:

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

Ceea ce este generat este codul, astfel încât să îl puteți utiliza în programul dvs. așa cum este.

Un pic mai mult despre T4

Chiar dacă partea de script T4 poate fi scrisă în C#, este necesar să se separe codul T4 C# de codul C# care este generat efectiv. Partea care face această distincție este <# .... #> . <# .... #> este codul care este executat ca script, nu codul care este de fapt emis în partea de script a T4.

<# .... #> Conținutul C# în sine nu este explicat pentru că este așa cum este, dar <# .... #> există mai multe tipuri de cadre. Există următoarele modalități de utilizare a fiecăruia.

Explicarea codului
<#@ .... #> Este utilizat în principal în declararea diferitelor anteturi. Se utilizează la începutul codului T4 în assembly declarația și import .
<# .... #> Scrieți codul care este procesat de T4. Acesta poate fi împărțit în mai multe linii. Orice este descris în acest interval acționează doar ca o operație și nu afectează textul de ieșire.
<#= .... #> Aceasta este utilizată atunci când doriți să scoateți o valoare, cum ar fi o variabilă, ca rezultat de ieșire. string text = "Sample"; De exemplu, dacă scrieți o variabilă <#= text #> numită , va fi Sample rezultat.
<#+ .... #> Folosit pentru a defini clase și metode. Practic, este scris la sfârșitul fișierului T4.

Despre editorul T4

Dacă nu aveți o extensie în Visual Studio, deschiderea unui fișier .tt va fi afișată în text alb-negru fără culoare, ceea ce este destul de dificil de văzut.

Unele dintre ele pot afișa o extensie pentru fișierele .tt într-un mod ușor de citit, așa că vă rugăm să o găsiți pe cea care vă place. Deoarece este realizat de voluntari, conținutul se poate schimba în funcție de perioada anului și de versiunea Visual Studio. Extensiile pot fi adăugate din meniul Visual Studio sub Extensii.

Iată ce am văzut în Visual Studio 2022 cu o extensie numită "T4 Language".