ใช้ Visual Studio และ Text Template Transformation Toolkit (T4) เพื่อสร้างโค้ดโดยอัตโนมัติ
สภาพแวดล้อมในการทํางาน
- วิชวลสตูดิโอ
-
- วิชวลสตูดิโอ 2022
- ตาข่าย
-
- .NET 8.0
- หน้าต่าง
-
- หน้าต่าง 11
ข้อกําหนดเบื้องต้น
- วิชวลสตูดิโอ
-
- ใช้งานได้แม้กับเวอร์ชันที่ค่อนข้างเก่ากว่า
- ตาข่าย
-
- ใช้งานได้แม้กับเวอร์ชันที่ค่อนข้างเก่ากว่า
ทีแรก
โดยปกติเมื่อสร้างโค้ด คุณคิดว่าคุณจะสร้างโค้ดโดยการพิมพ์อักขระด้วยตนเอง แต่ถ้าคุณต้องการสร้างโค้ดตามโค้ดหรือข้อมูลที่จําเป็นต้องสร้างโดยกฎหมายเฉพาะ ก็สะดวกที่จะสามารถสร้างโค้ดได้โดยอัตโนมัติ ส่วนนี้อธิบายวิธีการใช้ Text Template Transformation Toolkit (T4) เพื่อสร้างโค้ดโดยอัตโนมัติ
เนื่องจาก T4 เป็นรูปแบบการเขียนสคริปต์ จึงง่ายมากที่จะสร้างโค้ดใน Visual Studio ทันทีหลังจากสร้างไฟล์ T4 มีการเขียนว่ามันสร้างโค้ดโดยอัตโนมัติ แต่สิ่งที่สร้างขึ้นเป็นเพียงข้อความดังนั้นจึงเป็นไปได้ที่จะสร้างอะไรก็ได้ในรูปแบบข้อความเช่น XML และ JSON นอกเหนือจากโปรแกรม
จุดประสงค์หลักของเคล็ดลับนี้คือเพื่ออธิบายขั้นตอนในการสร้างโค้ดโดยอัตโนมัติใน T4 ดังนั้นฉันจะไม่ลงรายละเอียดของ T4 ในเชิงลึก หากคุณเคยเขียนโปรแกรมใน C# คุณจะเข้าใจได้ทันที หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ T4 โปรดตรวจสอบเว็บไซต์อย่างเป็นทางการและเว็บไซต์อื่นๆ
เงื่อนไขเบื้องต้น
เคล็ดลับนี้ถือว่ามีสิ่งต่อไปนี้:
- Visual Studio ที่ติดตั้งบน Windows
- ความเข้าใจเกี่ยวกับ C#
T4 สามารถใช้ได้ในโครงการส่วนใหญ่ ยกเว้นบางโครงการ ดังนั้นคุณจึงมีอิสระที่จะเลือกปริมาณงานของคุณระหว่างการติดตั้ง
สร้างโครงการ
ดังที่ได้กล่าวไว้ก่อนหน้านี้ T4 สามารถใช้ได้ในโครงการส่วนใหญ่ ยกเว้นบางโครงการ ดังนั้นจึงไม่สําคัญว่าคุณจะสร้างโครงการประเภทใด ในกรณีนี้ เรากําลังสร้างโปรเจ็กต์สําหรับแอปคอนโซล
สร้างไฟล์ T4 (.tt)
คลิกขวาที่แฟ้มโครงการหรือโฟลเดอร์เพื่อเพิ่มรายการใหม่
คลิกปุ่มดูเทมเพลตทั้งหมด
เลือก "ทั่วไป" จากแผนผังทางด้านซ้าย และ "เทมเพลตข้อความ" จากรายการตรงกลาง ชื่อไฟล์เป็นแบบโดยพลการ
ทันทีหลังจากสร้างไฟล์ คุณอาจเห็นกล่องโต้ตอบที่คล้ายกับด้านล่าง สิ่งนี้จะปรากฏขึ้นเมื่อ T4 file ถูกสร้างขึ้นโดยอัตโนมัติ T4 file ถูกสร้างขึ้นโดยอัตโนมัติทุกครั้งที่ file ถูกบันทึกหรือ viewed. หากคุณต้องการดําเนินการสร้างอัตโนมัติตามที่เป็นอยู่ ให้คลิกปุ่ม "ตกลง" หากคุณไม่ต้องการให้กล่องโต้ตอบปรากฏขึ้นทุกครั้ง ให้เลือก "อย่าแสดงข้อความนี้อีก" โปรดทราบว่าหากมีการอธิบายกระบวนการที่ผิดกฎหมายในไฟล์ T4 ตามที่ระบุไว้ในกล่องโต้ตอบ กระบวนการนั้นจะถูกดําเนินการตามนั้น
หลังจากที่คุณเพิ่มแฟ้ม คุณจะเห็นว่า แฟ้ม .tt ถูกเพิ่มลงใน Solution Explorer
เนื้อหาของไฟล์มีดังนี้
ถ้าคุณแยกไฟล์ .tt ใน Solution Explorer คุณจะเห็นไฟล์ข้อความที่มีชื่อเดียวกัน นี่จะเป็นไฟล์ที่สร้างขึ้นโดยอัตโนมัติ เนื่องจากเรายังไม่ได้เขียนอะไรเลย เนื้อหาของไฟล์จึงว่างเปล่า
ทําให้ไฟล์ที่สร้างขึ้นโดยอัตโนมัติเป็นไฟล์.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 Editor
หากคุณไม่มีนามสกุลใน Visual Studio การเปิดไฟล์ .tt จะแสดงเป็นข้อความขาวดําโดยไม่มีสีซึ่งค่อนข้างยากที่จะมองเห็น
บางไฟล์อาจแสดงนามสกุลสําหรับไฟล์ .tt ในลักษณะที่อ่านง่าย ดังนั้นโปรดค้นหานามสกุลที่คุณชอบ เนื้อหาอาจเปลี่ยนแปลงได้ขึ้นอยู่กับช่วงเวลาของปีและเวอร์ชันของ Visual Studio สามารถเพิ่มส่วนขยายได้จากเมนู Visual Studio ภายใต้ ส่วนขยาย
นี่คือสิ่งที่ฉันเห็นใน Visual Studio 2022 พร้อมส่วนขยายที่เรียกว่า "ภาษา T4"