استخدم Visual Studio ومجموعة أدوات تحويل قالب النص (T4) لإنشاء التعليمات البرمجية تلقائيا

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التشغيل

فيجوال ستوديو
  • فيجوال ستوديو 2022
.صافي
  • .NET 8.0
نوافذ
  • ويندوز ١١

المتطلبات المسبقه

فيجوال ستوديو
  • يعمل حتى مع إصدار أقدم إلى حد ما
.صافي
  • يعمل حتى مع إصدار أقدم إلى حد ما

في البداية

عادة ، عند إنشاء رمز ، تعتقد أنك ستنشئ رمزا عن طريق كتابة الأحرف يدويا ، ولكن إذا كنت ترغب في إنشاء رمز بناء على رمز أو بيانات تحتاج إلى إنشائها بواسطة قانون معين ، فمن الملائم أن تكون قادرا على إنشائها تلقائيا. يصف هذا القسم كيفية استخدام مجموعة أدوات تحويل قالب النص (T4) لإنشاء التعليمات البرمجية تلقائيا.

نظرا لأن T4 هو تنسيق برمجة نصية ، فمن السهل جدا إنشاء تعليمات برمجية في Visual Studio مباشرة بعد إنشاء ملف T4. مكتوب أنه يولد التعليمات البرمجية تلقائيا ، ولكن ما يتم إنشاؤه هو مجرد نص ، لذلك من الممكن إنشاء أي شيء بتنسيق نصي مثل XML و JSON بالإضافة إلى البرامج.

الغرض الرئيسي من هذه النصيحة هو شرح خطوات إنشاء التعليمات البرمجية تلقائيا في T4 ، لذلك لن أخوض في تفاصيل T4 بعمق. إذا سبق لك أن كتبت برنامجا في C # ، فسوف تفهمه على الفور. إذا كنت تريد معرفة المزيد عن T4 ، فيرجى مراجعة الموقع الرسمي والمواقع الأخرى.

الشرط المسبق

تفترض هذه النصيحة ما يلي:

  • فيجوال ستوديو مثبت على ويندوز
  • فهم 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".