שימוש ב- Visual Studio ובערכת הכלים להמרת תבנית טקסט (T4) כדי ליצור קוד באופן אוטומטי

עודכן דף :
תאריך יצירת דף :

סביבת הפעלה

Visual Studio
  • Visual Studio 2022
.רשת
  • .NET 8.0
חלונות
  • חלונות 11

דרישות מוקדמות

Visual Studio
  • זה עובד גם עם גרסה קצת יותר מבוגרת
.רשת
  • זה עובד גם עם גרסה קצת יותר מבוגרת

בהתחלה

בדרך כלל, בעת יצירת קוד, אתה חושב שתיצור קוד על ידי הקלדת תווים באופן ידני, אבל אם אתה רוצה ליצור קוד המבוסס על קוד או נתונים שצריך ליצור על ידי חוק מסוים, נוח להיות מסוגל ליצור אותו באופן אוטומטי. סעיף זה מתאר כיצד להשתמש בערכת הכלים להמרת תבנית טקסט (T4) כדי ליצור קוד באופן אוטומטי.

מכיוון ש- T4 הוא פורמט scripting, קל מאוד ליצור קוד ב- Visual Studio מיד לאחר יצירת קובץ T4. זה כתוב כי הוא יוצר קוד באופן אוטומטי, אבל מה שנוצר הוא רק טקסט, ולכן ניתן ליצור כל דבר בפורמט טקסט כגון XML ו- JSON בנוסף לתוכניות.

המטרה העיקרית של טיפ זה היא להסביר את השלבים ליצירת קוד באופן אוטומטי ב- T4, כך שלא אכנס לפרטים של T4 לעומק. אם אי פעם כתבת תוכנית ב- C#, תבין אותה מיד. אם אתה רוצה לדעת יותר על T4, אנא בדוק את האתר הרשמי ואתרים אחרים.

תנאי מקדים

עצה זו מניחה את הדברים הבאים:

  • Visual Studio מותקן ב- Windows
  • הבנה של C#

T4 יכול לשמש ברוב הפרויקטים, למעט כמה, אז אתה בעצם חופשי לבחור את עומס העבודה שלך במהלך ההתקנה.

יצירת פרוייקט

כפי שהוזכר קודם לכן, ניתן להשתמש ב- T4 ברוב הפרוייקטים, למעט כמה, כך שלא משנה איזה סוג פרוייקט אתה יוצר. במקרה זה, אנו יוצרים פרוייקט עבור אפליקציית קונסולה.

יצירת קובץ T4 ( .tt)

לחץ באמצעות לחצן העכבר הימני על קובץ פרוייקט או תיקיה כדי להוסיף פריט חדש.

לחץ על לחצן הצג את כל התבניות.

בחר "כללי" מהעץ משמאל, ו"תבניות טקסט" מהרשימה באמצע. שם הקובץ שרירותי.

מיד לאחר יצירת הקובץ, ייתכן שתראה תיבת דו-שיח דומה לזו שלהלן. אפשרות זו מוצגת כאשר קובץ T4 נוצר באופן אוטומטי. קבצי T4 נוצרים באופן אוטומטי בכל פעם שהקובץ נשמר או מוצג. אם ברצונך לבצע את תהליך הייצור האוטומטי כפי שהוא, לחץ על הלחצן "אישור". אם אינך מעוניין שתיבת הדו-שיח תופיע בכל פעם, סמן את האפשרות "אל תציג הודעה זו שוב". שים לב שאם תהליך בלתי חוקי מתואר בקובץ T4 כאמור בתיבת הדו-שיח, הוא יבוצע בהתאם.

לאחר הוספת הקובץ, באפשרותך לראות שקובץ ה- .tt נוסף לסייר הפתרונות.

תוכן הקובץ הוא כדלקמן.

אם תחלץ את קובץ ה- .tt בסייר הפתרונות, תראה קובץ טקסט באותו שם. זה יהיה הקובץ שנוצר באופן אוטומטי. מכיוון שעדיין לא כתבנו דבר, תוכן הקובץ ריק.

הפיכת קובץ שנוצר אוטומטית לקובץ .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

אם אין לך סיומת ב- Visual Studio, פתיחת קובץ .tt תוצג בטקסט שחור-לבן ללא צבע, וזה די קשה לראות.

חלקם עשויים להציג סיומת עבור קבצי .tt בצורה קלה לקריאה, אז אנא מצא את זה שאתה אוהב. מכיוון שהוא נעשה על ידי מתנדבים, התוכן עשוי להשתנות בהתאם לעונת השנה ולגירסה של Visual Studio. ניתן להוסיף הרחבות מתפריט Visual Studio תחת הרחבות.

הנה מה שראיתי ב- Visual Studio 2022 עם הרחבה בשם "T4 Language".