【T4實踐-2】--創建設計時模板
使用設計時 T4 文本模板,您可以在 Visual Studio 項目中生成程序代碼和其他文件。 通常,您編寫一些模板,以便它們根據來自模型的數據來改變所生成的代碼。 模型是包含有關應用程序要求的關鍵信息的文件或數據庫。像一些常用的框架,基本都是根據數據庫模型來生成代碼框架的。
一、具體步驟
1、新建項目名為:T4Sample,添加新項,選擇“文本模板”即可創建設計時模板
模板屬性,請確認:
自定義工具 = |
TextTemplatingFileGenerator |
生成操作 = |
無 |
打開模板,默認只有兩行語句
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
2、修改模板,依然以HelloWorld為例
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections.Generic" #>
using System;
namespace Test
{
public class HelloWorld
{
public static void Main(string[] args)
{
<#
List<Person> people = GetPersonList();
foreach(Person p in people)
{
#>
Console.WriteLine("Hello {0},Welcome to T4 World!","<#= p.Name #>");
<#}
#>
}
}
}
<#+
//類
public class Person
{
///名稱
public string Name{ get; set; }
public Person(string name)
{
this.Name = name;
}
}
//初始化眾人
public List<Person> GetPersonList()
{
List<Person> people = new List<Person>();
Person p1 = new Person("Tom");
Person p2 = new Person("Jim");
Person p3 = new Person("Lucy");
people.Add(p1);
people.Add(p2);
people.Add(p3);
return people;
}
#>
3、生成代碼,可通過以下方式
- 保存
- 編輯模板,然后將焦點更改到其他 Visual Studio 窗口
- 右擊模板文件,選擇“運行自定義工具”
- 在“解決方案資源管理器”工具欄中單擊“轉換所有模板”。 這將轉換 Visual Studio 解決方案中的所有模板。
生成代碼如下:
using System;
namespace Test
{
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine("Hello {0},Welcome to T4 World!", "Tom");
Console.WriteLine("Hello {0},Welcome to T4 World!", "Jim");
Console.WriteLine("Hello {0},Welcome to T4 World!", "Lucy");
}
}
}
二、模板指令
首先了解最重要的指令塊,在以后復雜的模板編寫中,將會經常用到。
其實T4模板就是C#代碼(當然還有VB)與文本的組合,一些邏輯代碼就跟寫C#代碼一樣。下一章將給出具體如何寫T4模板。
C#代碼與T4不同,就是引用、調試、輸出等方面,而T4中最重要的指令Template ,就包含這些不同。
所以這里特別重點強調下指令Template,方便在以后復雜的T4模板編寫中,能夠得心應手。
使用 Template 指令
<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"]
[compilerOptions="options"] #>
template 指令有多個特性,通過這些特性可以指定轉換的不同方面。 所有特性都是可選的。
1、compilerOptions 特性
示例:
compilerOptions="optimize+"
有效值:
任何有效的編譯器選項。
在模板已經轉換為 Visual C# 或 Visual Basic 並且生成的代碼已編譯時會應用這些選項。
2、culture 特性
示例:
culture="de-CH"
有效值:
"",不變的區域性,它是默認值。
表示為 xx-XX 形式字符串的區域性。 例如:en-US、ja-JP、de-CH、de-DE。
Culture 特性指定將表達式塊轉換為文本時要使用的區域性。
3、debug 特性
示例:
debug="true"
有效值:
true, false. 默認值為 false。
debug 特性指定是否啟用調試。 如果是 true,則中間代碼文件將包含使調試器能夠識別模板中中斷或異常發生位置的信息。 對於
設計時模板,中間代碼文件將寫入您的 %TEMP% 目錄。
若要在模板執行的特定點啟動調試器,請插入對 Launch 的調用。 若要在后續的點處中斷執行,請插入對 Break 的調用。
<#@ template debug="true" language="C#" #>
<#@ output extension=".txt" #>
Output something.
<#
// Break here:
System.Diagnostics.Debugger.Launch();
#>
Output more.
<#
// Break here also:
System.Diagnostics.Debugger.Break();
#>
Output more.
4、hostspecific 特性
有效值:
true, false. 默認值為 false。
如果將此特性的值設置為 true,則會將名為 Host 的屬性添加到由文本模板生成的類中。 該屬性是對轉換引擎的宿主的引用,並聲
明為 Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。 如果已經定義了自定義宿主,則可以將其轉換為自
定義宿主類型。
因為此屬性的類型取決於宿主的類型,所以僅當編寫只適用於特定宿主的文本模板時才有用。
當 hostspecific 為 true,而且正在使用 Visual Studio 時,可以將 this.Host 強制轉換為 IServiceProvider,以訪問 Visual
Studio 功能。 還可以使用 Host.ResolvePath(filename) 來獲得項目中文件的絕對路徑。
5、language 特性
示例:
language="VB"
有效值:
C#(默認值)
VB
(值 VBv3.5 和 C#v3.5 在此版本中已過時,但是會解釋為 VB 和 C#。)
language 特性指定要用於語句和表達式塊中的源代碼的語言(Visual Basic 或 Visual C#)。 從中生成輸出的中間代碼文件將使
用此語言。 此語言與您的模板生成的語言無關,它可以是任何類型的文本。
6、inherits 特性
可以指定模板的程序代碼可以繼承自另一個類,這個類也可以從文本模板生成。
三、后續
如果編寫T4模板,如何更好更快的編寫呢?下一章,將給出答案。