Sử dụng Visual Studio và Bộ công cụ Chuyển đổi Mẫu Văn bản (T4) để tự động tạo mã

Trang Cập Nhật :
Ngày tạo trang :

Môi trường hoạt động

Visual Studio
  • Visual Studio 2022
.MẠNG
  • .NET 8.0
Windows
  • cửa sổ 11

Điều kiện tiên quyết

Visual Studio
  • Nó hoạt động ngay cả với phiên bản cũ hơn một chút
.MẠNG
  • Nó hoạt động ngay cả với phiên bản cũ hơn một chút

Lúc đầu

Thông thường, khi tạo mã, bạn nghĩ rằng bạn sẽ tạo mã bằng cách nhập các ký tự theo cách thủ công, nhưng nếu bạn muốn tạo mã dựa trên mã hoặc dữ liệu cần được tạo bởi một luật cụ thể, thật tiện lợi để có thể tự động tạo nó. Phần này mô tả cách sử dụng Bộ công cụ Chuyển đổi Mẫu Văn bản (T4) để tự động tạo mã.

Vì T4 là một định dạng kịch bản, rất dễ dàng để tạo mã trong Visual Studio ngay sau khi tạo tệp T4. Nó được viết rằng nó tự động tạo mã, nhưng những gì được tạo ra chỉ là văn bản, vì vậy có thể tạo bất cứ thứ gì ở định dạng văn bản như XML và JSON ngoài các chương trình.

Mục đích chính của mẹo này là để giải thích các bước để thực sự tự động tạo mã trong T4, vì vậy tôi sẽ không đi sâu vào chi tiết của T4. Nếu bạn đã từng viết một chương trình bằng C #, bạn sẽ hiểu nó ngay lập tức. Nếu bạn muốn biết thêm về T4, vui lòng kiểm tra trang web chính thức và các trang web khác.

Điều kiện tiên quyết

Mẹo này giả định như sau:

  • Visual Studio được cài đặt trên Windows
  • Hiểu biết về C #

T4 có thể được sử dụng trong hầu hết các dự án, ngoại trừ một số ít, vì vậy về cơ bản bạn có thể tự do lựa chọn khối lượng công việc của mình trong khi cài đặt.

Tạo dự án

Như đã đề cập trước đó, T4 có thể được sử dụng trong hầu hết các dự án, ngoại trừ một số ít, vì vậy không quan trọng bạn tạo loại dự án nào. Trong trường hợp này, chúng tôi đang tạo một dự án cho một ứng dụng console.

Tạo tệp T4 (.tt)

Bấm chuột phải vào tệp hoặc thư mục dự án để thêm mục mới.

Nhấn vào Xem tất cả mẫu cái nút.

Chọn "Chung" từ cây bên trái và "Mẫu văn bản" từ danh sách ở giữa. Tên tập tin là tùy ý.

Ngay sau khi tạo tệp, bạn có thể thấy một hộp thoại tương tự như hộp thoại bên dưới. Điều này được hiển thị khi tệp T4 được tạo tự động. Các tệp T4 được tạo tự động mỗi khi tệp được lưu hoặc xem. Nếu bạn muốn thực hiện quy trình tạo tự động như hiện tại, hãy nhấp vào nút "OK". Nếu bạn không muốn hộp thoại xuất hiện mỗi lần, hãy chọn "Không hiển thị lại thông báo này". Xin lưu ý rằng nếu một quá trình bất hợp pháp được mô tả trong tệp T4 như đã nêu trong hộp thoại, nó sẽ được thực hiện tương ứng.

Sau khi bạn thêm tệp, bạn có thể thấy rằng tệp .tt đã được thêm vào Solution Explorer.

Nội dung của tệp như sau.

Nếu bạn giải nén tệp .tt trong Solution Explorer, bạn sẽ thấy một tệp văn bản có cùng tên. Đây sẽ là tệp được tạo tự động. Vì chúng tôi chưa viết gì cả, nội dung của tệp trống.

Đặt tệp được tạo tự động thành tệp .cs

Nếu bạn đang sử dụng T4, rất có thể bạn sẽ muốn sử dụng tiện ích mở rộng .cs thay vì .txt mặc định, vì mã cho chương trình của bạn sẽ được tạo tự động. Trong trường hợp đó, hãy mở tệp .tt và output extension .cs lưu nó với .

Tệp được tạo tự động bây giờ sẽ có phần mở rộng .cs. Bản thân tên tệp giống với tệp .tt, vì vậy nếu bạn muốn thay đổi nó, hãy thay đổi tên của tệp .tt.

Hiện tại, hãy viết một cái gì đó và xuất nó thành một tệp được tạo tự động

Trong T4, nội dung của những gì bạn viết về cơ bản là đầu ra như chúng vốn có. <# ... #> là quá trình T4 và phần còn lại là văn bản đầu ra thực tế.

Ví dụ: hãy đặt nó trong tệp .tt như sau.

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

Khi bạn lưu nó, tệp được tạo tự động sẽ xuất ra chính xác như bạn đã viết.

Đầu ra là mã, vì vậy tất nhiên nó cũng có thể được gọi từ Program.cs.

Cố gắng tạo mã tự động

Như đã đề cập ở trên, tôi đã xác nhận rằng những gì tôi viết sẽ được xuất ra như hiện tại, nhưng điều này không khác gì những gì tôi viết bình thường. Bây giờ, hãy thực sự sử dụng tập lệnh T4 để tự động tạo mã. Có rất nhiều cách để làm cho nó, vì vậy xin vui lòng chỉ đưa ra một lời giải thích ngắn gọn ở đây, và sau đó làm lại nó như bạn muốn làm cho nó.

Lần này, làm ví dụ, hãy tạo một phương thức thêm phương thức phân tích cú pháp của từng loại vào chuỗi và trả về ParseXXXX giá trị mặc định được chỉ định nếu nó không thể được chuyển đổi. Đây chỉ là một ví dụ về sáng tạo, vì vậy hãy thêm nó nếu bạn cảm thấy rằng có bất kỳ phần nào còn thiếu.

Nếu bạn có thể hiểu C # mà không cần giải thích chi tiết, sẽ nhanh hơn để xem nó, vì vậy tôi sẽ đăng mã đầy đủ trướ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;
  }
<# } #>
}

Những gì chúng ta đang làm là xác định các kiểu List lần đầu tiên được tạo bằng , và sau đó xoay chúng foreach lại để tạo ra số lượng phương thức đó. Phần kịch bản của T4 được viết bằng C #, vì vậy nếu bạn hiểu C #, bạn sẽ có thể hiểu nó.

Khi bạn thực hiện việc này, mã sau được tạo ra:

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

Những gì được tạo ra là mã, vì vậy bạn có thể sử dụng nó trong chương trình của mình như hiện tại.

Thêm một chút về T4

Mặc dù phần tập lệnh T4 có thể được viết bằng C #, nhưng cần phải tách mã T4 C # khỏi mã C # thực sự được tạo. Phần tạo nên sự khác biệt đó là <# .... #> . <# .... #> là mã được thực thi dưới dạng tập lệnh, không phải mã thực sự được xuất ra trong phần tập lệnh của T4.

<# .... #> Bản thân nội dung của C # không được giải thích vì chúng như vậy, nhưng <# .... #> có một số loại khung. Có những cách sau đây để sử dụng mỗi.

Giải thích
<#@ .... #> Nó chủ yếu được sử dụng trong việc khai báo các tiêu đề khác nhau. Nó được sử dụng ở đầu mã T4 trong khai assembly báo và import .
<# .... #> Viết mã được xử lý bởi T4. Nó có thể được chia thành nhiều dòng. Bất cứ điều gì được mô tả trong phạm vi này chỉ hoạt động như một hoạt động và không ảnh hưởng đến văn bản đầu ra.
<#= .... #> Điều này được sử dụng khi bạn muốn xuất một giá trị như một biến làm kết quả đầu ra. string text = "Sample"; Ví dụ: nếu bạn viết một biến <#= text #> có tên , sẽ là Sample đầu ra.
<#+ .... #> Được sử dụng để định nghĩa các lớp và phương thức. Về cơ bản, nó được viết ở cuối tệp T4.

Giới thiệu về Trình chỉnh sửa T4

Nếu bạn không có phần mở rộng trong Visual Studio, việc mở tệp .tt sẽ được hiển thị bằng văn bản đen trắng không có màu, điều này khá khó nhìn.

Một số trong số chúng có thể hiển thị phần mở rộng cho các tệp .tt theo cách dễ đọc, vì vậy vui lòng tìm phần mở rộng bạn thích. Vì nó được thực hiện bởi các tình nguyện viên, nội dung có thể thay đổi tùy thuộc vào thời gian trong năm và phiên bản Visual Studio. Phần mở rộng có thể được thêm từ menu Visual Studio trong Phần mở rộng.

Đây là những gì tôi đã thấy trong Visual Studio 2022 với tiện ích mở rộng có tên "Ngôn ngữ T4".