Gunakan Visual Studio dan Kit Alat Transformasi Templat Teks (T4) untuk menjana kod secara automatik

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran operasi

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

Prasyarat

Visual Studio
  • Ia berfungsi walaupun dengan versi yang agak lama
.BERSIH
  • Ia berfungsi walaupun dengan versi yang agak lama

Pada mulanya

Biasanya, apabila membuat kod, anda berfikir bahawa anda akan membuat kod dengan menaip aksara secara manual, tetapi jika anda ingin membuat kod berdasarkan kod atau data yang perlu dibuat oleh undang-undang tertentu, adalah mudah untuk dapat menjananya secara automatik. Bahagian ini menerangkan cara menggunakan Kit Alat Transformasi Templat Teks (T4) untuk menjana kod secara automatik.

Memandangkan T4 ialah format skrip, sangat mudah untuk menjana kod dalam Visual Studio sejurus selepas mencipta fail T4. Ditulis bahawa ia menjana kod secara automatik, tetapi apa yang dijana hanyalah teks, jadi adalah mungkin untuk menjana apa-apa dalam format teks seperti XML dan JSON sebagai tambahan kepada program.

Tujuan utama petua ini adalah untuk menerangkan langkah-langkah untuk benar-benar menjana kod secara automatik dalam T4, jadi saya tidak akan membincangkan butiran T4 secara mendalam. Jika anda pernah menulis program dalam C#, anda akan memahaminya dengan segera. Jika anda ingin mengetahui lebih lanjut mengenai T4, sila semak laman web rasmi dan laman web lain.

prasyarat

Petua ini mengandaikan perkara berikut:

  • Visual Studio dipasang pada Windows
  • Pemahaman tentang C#

T4 boleh digunakan dalam kebanyakan projek, kecuali beberapa, jadi anda pada asasnya bebas memilih beban kerja anda semasa pemasangan.

Buat projek

Seperti yang dinyatakan sebelum ini, T4 boleh digunakan dalam kebanyakan projek, kecuali beberapa, jadi tidak kira jenis projek yang anda buat. Dalam kes ini, kami mencipta projek untuk apl konsol.

Buat fail T4 (.tt)

Klik kanan fail atau folder projek untuk menambah item baharu.

Klik butang Lihat Semua Templat.

Pilih "Umum" daripada pokok di sebelah kiri, dan "Templat Teks" daripada senarai di tengah. Nama fail adalah sewenang-wenangnya.

Sejurus selepas membuat fail, anda mungkin melihat dialog yang serupa dengan yang di bawah. Ini dipaparkan apabila fail T4 dijana secara automatik. Fail T4 dijana secara automatik setiap kali fail disimpan atau dilihat. Jika anda ingin melakukan proses penjanaan automatik seperti sedia ada, klik butang "OK". Jika anda tidak mahu dialog muncul setiap kali, semak "Jangan tunjukkan mesej ini lagi". Sila ambil perhatian bahawa jika proses haram diterangkan dalam fail T4 seperti yang dinyatakan dalam dialog, ia akan dilaksanakan dengan sewajarnya.

Selepas anda menambah fail, anda boleh melihat bahawa fail .tt telah ditambahkan pada Solution Explorer.

Kandungan fail adalah seperti berikut.

Jika anda mengekstrak fail .tt dalam Solution Explorer, anda akan melihat fail teks dengan nama yang sama. Ini akan menjadi fail yang dijana secara automatik. Oleh kerana kami belum menulis apa-apa lagi, kandungan fail itu kosong.

Jadikan fail yang dijana secara automatik sebagai fail .cs

Jika anda menggunakan T4, kemungkinan besar anda mahu menggunakan sambungan .cs dan bukannya .txt lalai, kerana kod untuk program anda akan dijana secara automatik. Dalam kes itu, buka fail .tt dan output extension .cs simpan dengan .

Fail yang dijana secara automatik kini sepatutnya mempunyai sambungan .cs. Nama fail itu sendiri adalah sama dengan fail .tt, jadi jika anda ingin mengubahnya, tukar nama fail .tt.

Buat masa ini, tulis sesuatu dan keluarkannya ke fail yang dijana secara automatik

Dalam T4, kandungan apa yang anda tulis pada asasnya adalah output seperti sedia ada. <# ... #> ialah proses T4, dan selebihnya ialah teks output sebenar.

Sebagai contoh, mari kita masukkan ke dalam fail .tt seperti berikut.

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

Apabila anda menyimpannya, fail yang dijana secara automatik harus dikeluarkan tepat seperti yang anda tulis.

Outputnya ialah kod, jadi sudah tentu ia juga boleh dipanggil daripada Program.cs.

Cuba jana kod secara automatik

Seperti yang dinyatakan di atas, saya telah mengesahkan bahawa apa yang saya tulis akan dikeluarkan seperti sedia ada, tetapi ini tidak berbeza dengan apa yang saya tulis seperti biasa. Sekarang, mari kita benar-benar menggunakan skrip T4 untuk menjana kod secara automatik. Terdapat pelbagai cara untuk membuatnya, jadi sila berikan penjelasan ringkas sahaja di sini, dan kemudian buat semula mengikut kehendak anda.

Kali ini, sebagai contoh, mari kita buat kaedah yang menambah kaedah penghuraian setiap jenis pada rentetan dan mengembalikan ParseXXXX nilai lalai yang ditentukan jika ia tidak boleh ditukar. Ini hanyalah contoh penciptaan, jadi sila tambahkannya jika anda merasakan terdapat mana-mana bahagian yang kurang.

Jika anda boleh memahami C# tanpa menerangkan butirannya, ia akan lebih cepat untuk melihatnya, jadi saya akan menyiarkan kod penuh terlebih dahulu.

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

Apa yang kami lakukan ialah mentakrifkan jenis List buat kali pertama untuk dicipta dengan , dan kemudian mengubahnya foreach untuk menjana bilangan kaedah tersebut. Bahagian skrip T4 ditulis dalam C#, jadi jika anda memahami C#, anda sepatutnya boleh memahaminya.

Apabila anda melakukan ini, kod berikut dijana:

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

Apa yang dijana ialah kod, jadi anda boleh menggunakannya dalam program anda seperti sedia ada.

Sedikit lagi mengenai T4

Walaupun bahagian skrip T4 boleh ditulis dalam C#, adalah perlu untuk memisahkan kod T4 C# daripada kod C# yang sebenarnya dijana. Bahagian yang membuat perbezaan itu ialah <# .... #> . <# .... #> ialah kod yang dilaksanakan sebagai skrip, bukan kod yang sebenarnya dikeluarkan dalam bahagian skrip T4.

<# .... #> Kandungan C# itu sendiri tidak dijelaskan kerana ia seperti sedia ada, tetapi <# .... #> terdapat beberapa jenis bingkai. Terdapat cara berikut untuk menggunakan setiap satu.

Penjelasan Kod
<#@ .... #> Ia digunakan terutamanya dalam pengisytiharan pelbagai tajuk. Ia digunakan pada permulaan kod T4 dalam assembly pengisytiharan dan .import
<# .... #> Tulis kod yang diproses oleh T4. Ia boleh dibahagikan kepada beberapa baris. Apa-apa sahaja yang diterangkan dalam julat ini hanya bertindak sebagai operasi dan tidak menjejaskan teks output.
<#= .... #> Ini digunakan apabila anda ingin mengeluarkan nilai seperti pemboleh ubah sebagai hasil output. string text = "Sample"; Sebagai contoh, jika anda menulis pembolehubah <#= text #> yang dipanggil , akan menjadi Sample output.
<#+ .... #> Digunakan untuk mentakrifkan kelas dan kaedah. Pada asasnya, ia ditulis pada penghujung fail T4.

Mengenai Editor T4

Jika anda tidak mempunyai sambungan dalam Visual Studio, membuka fail .tt akan dipaparkan dalam teks hitam putih tanpa warna, yang agak sukar untuk dilihat.

Sesetengah daripada mereka mungkin memaparkan sambungan untuk fail .tt dengan cara yang mudah dibaca, jadi sila cari yang anda suka. Memandangkan ia dibuat oleh sukarelawan, kandungannya mungkin berubah bergantung pada masa dalam setahun dan versi Visual Studio. Sambungan boleh ditambah daripada menu Visual Studio di bawah Sambungan.

Inilah yang saya lihat dalam Visual Studio 2022 dengan sambungan yang dipanggil "Bahasa T4".