【T4實踐(四)】創建運行時模板


【T4實踐(四)】創建運行時模板

使用 Visual Studio 預處理過的文本模板,可以在運行時在應用程序中生成文本字符串。 執行應用程序的計算機不必具有 Visual Studio。 預處理過的模板有時稱為“運行時文本模板”。每個模板都包含將顯示在生成的字符串中的文本和程序代碼的片段。 程序片段為字符串的可變部分提供值,還控制條件部分和重復部分。

創建運行時文本模板

一、具體步驟:

1、在解決方案資源管理器中,右擊項目,指向“添加”,再單擊“新建項”。


2、在“添加新項”對話框中,選擇“預處理文本模板”。 (在 Visual Basic 中的“常用項\常規”下查看。)

3、鍵入模板文件的名稱,如:MyWebPage

4、單擊“添加”。

   將創建一個擴展名為 .tt 的新文件。 該文件的“自定義工具”屬性設置為 TextTemplatingFilePreprocessor。與之前講到的設計時模板不同。

  設計時模板: TextTemplatingFileGenerator
  運行時模板:TextTemplatingFilePreprocessor

  模板轉換:
  當然設計時模板可以轉為運行時模板,只要將該文件的“自定義工具”屬性設置為 TextTemplatingFilePreprocessor即可。
  但是運行時模板很多情況下不能轉為設計時模板。后面的內容會幫我們揭開緣由。

二、實例--顯示課程網頁

在新建模板的同時,生成了模板的部分類。

一個是以模板名+code結尾:MyWebPageCode.cs,在這里我們可以聲明模板需要的變量、方法。

這里我們需要設置課程集合。

    public partial class MyWebPage
{
private List<string> items;

public List<string> Items
{
get { return items; }
set { items = value; }
}

public MyWebPage(List<string> data) { this.items = data; }
}


另一個請展開 .tt 文件節點,此附屬文件包含一個分部類,該類包含一個名為 TransformText() 的方法。這個方法中的內容會根據模板內容的變化而變化,其實就是模板代碼轉為C#代碼。此方法可以從應用程序中調用。

修改模板:

<#@ template language="C#" #>
<html>
<body>
<h1>計算機課程</h2>
<table>
<# foreach(string item in Items)
{ #
>
<tr><td>Course name : <#= item #> </td></tr>
<# } #>
</table>
</body>
</html>


查看附屬文件的部分類,方法:TransformText()

        public virtual string TransformText()
{
this.GenerationEnvironment = null;
this.Write("<html>\r\n<body>\r\n<h1>計算機課程</h2>\r\n<table>\r\n ");

#line 6 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
foreach(string item in Items)
{

#line default
#line hidden
this.Write(" <tr><td>Course name : ");

#line 8 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item));

#line default
#line hidden
this.Write(" </td></tr>\r\n ");

#line 9 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
}

#line default
#line hidden
this.Write(" </table>\r\n </body>\r\n </html>");
return this.GenerationEnvironment.ToString();
}

程序調用,對模板變量賦值,並調用模板,輸出文件。

        static void Main(string[] args)
{
List<string> items = new List<string>();
items.Add("計算機基礎");
items.Add("數據庫");
items.Add("計算機網絡");
MyWebPage page = new MyWebPage(items);
String pageContent = page.TransformText();
//如果有漢字,需要設置編碼格式
System.IO.File.WriteAllText("outputPage.html", pageContent,Encoding.UTF8);
}

運行程序,生成模板:

生成的HTML

<html><body>
<h1>計算機課程</h2>
<table>
<tr><td>Course name : 計算機基礎 </td></tr>
<tr><td>Course name : 數據庫 </td></tr>
<tr><td>Course name : 計算機網絡 </td></tr>
</table>
</body></html>

瀏覽器打開效果:


在運行時生成文本,若要在特定命名空間中放置已生成的類,請設置文本模板文件的“自定義工具命名空間”屬性。

三、基本原理
由上述實例,我們已經基本了解了運行時模板的基本步驟,現在總結一下運行時模板的基本原理。

我們通常也通過C#輸出文件,可能也要按照一定的格式來生成。其實這里的運行時模板,就是這樣一個工具,設定好模板后,然后VS自動轉為C#代碼,在部分類中TransformText()方法,我們可以找到蹤跡。

運行時模板,簡單的說就是可視化的C#代碼生成器。

運行時模板,提供了可視化功能,將夾雜在C#代碼中的模板代碼拿出來,讓我們更加直觀的看到模板的真實樣子。方便進行修改和維護。

運行時模板就好比C#代碼,比起設計時模板,方便跟蹤調試。

四、源碼下載

點擊下載


五、后續,下一篇文章:設計時模板與運行時模板比較。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM