1. 程式人生 > >創建運行時模板

創建運行時模板

聲明 rtu 簡單的 odin 計時 rgb 自動生成 部分類 現在

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

一、具體步驟:

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

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

技術分享圖片

3、鍵入模板文件的名稱,如:MyWebPage
4、單擊“添加”。
將創建一個擴展名為 .tt 的新文件。 該文件的“自定義工具”屬性設置為 TextTemplatingFilePreprocessor。

技術分享圖片

與之前講到的設計時模板不同。
  設計時模板: TextTemplatingFileGenerator
  運行時模板:TextTemplatingFilePreprocessor

模板轉換:
  當然設計時模板可以轉為運行時模板,只要將該文件的“自定義工具”屬性設置為 TextTemplatingFilePreprocessor即可。
  但是運行時模板很多情況下不能轉為設計時模板。

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

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

技術分享圖片

我們另外新建一個此分部類的文件,以模板名+code結尾:MyWebPageCode.cs,在這裏我們可以聲明模板需要的變量、方法。

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

using System.Collections.Generic;

namespace T4Sample
{
    partial class MyWebPage
    {
        private List<string> items;

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


修改模板:

<#@ 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#代碼,比起設計時模板,方便跟蹤調試。

創建運行時模板