ใช้ 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"