【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#代碼,比起設計時模板,方便跟蹤調試。
四、源碼下載
五、后續,下一篇文章:設計時模板與運行時模板比較。