[转]T4模版引擎之基础入门
本文轉(zhuǎn)自:http://www.cnblogs.com/lzrabbit/archive/2012/07/15/2591085.html
額,T4好陌生的名字,和NuGet一樣很悲催,不為世人所熟知,卻又在背后默默無(wú)聞的奉獻(xiàn)著,直到現(xiàn)在我們項(xiàng)目組的人除了我之外,其它人還是對(duì)其豪無(wú)興趣,基本上是連看一眼都懶得看,可憐的娃啊。。。
T4(Text Template Transformation Toolkit)是微軟官方在VisualStudio 2008中開(kāi)始使用的代碼生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本塊和控制邏輯組成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制邏輯編寫(xiě)為程序代碼的片段。生成的文件可以是任何類型的文本,例如網(wǎng)頁(yè)、資源文件或任何語(yǔ)言的程序源代碼?,F(xiàn)在的VS中只要與代碼生成相關(guān)的場(chǎng)景基本上都能找T4的身影,比如MVC的視圖模板,Entity Framwork的DataContext模板等等。
在學(xué)習(xí)枯燥的概念前我們先來(lái)看一下用T4模版快速生成POCO實(shí)體類的示例
打開(kāi)VS2010建一個(gè)項(xiàng)目,然后右擊項(xiàng)目文件選擇新建項(xiàng),在文件列表中找到文件模版,如圖所示
修改TextTemplate1.tt文件內(nèi)容如下
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 { public class User{/// <summary>/// 用戶ID/// </summary>public int UserID { get; set; }/// <summary>/// 用戶名/// </summary>public string UserName { get; set; }/// <summary>/// 密碼/// </summary>public string Password { get; set; }/// <summary>/// Email/// </summary>public string Email { get; set; }/// <summary>/// 手機(jī)號(hào)/// </summary>public string Mobile { get; set; }} }點(diǎn)擊Ctrl+S然后可以看到自動(dòng)生成了一個(gè)TextTemplate1.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 { public class User{/// <summary>/// 用戶ID/// </summary>public int UserID { get; set; }/// <summary>/// 用戶名/// </summary>public string UserName { get; set; }/// <summary>/// 密碼/// </summary>public string Password { get; set; }/// <summary>/// Email/// </summary>public string Email { get; set; }/// <summary>/// 手機(jī)號(hào)/// </summary>public string Mobile { get; set; }} }是不是很神奇,T4模版引擎會(huì)根據(jù)你在模版里定義的內(nèi)容自動(dòng)生成相應(yīng)的文件,當(dāng)然本示例過(guò)于簡(jiǎn)單,完全不能展現(xiàn)T4的強(qiáng)大,當(dāng)你若真正了解T4后,會(huì)發(fā)現(xiàn)神馬代碼生成器全都是浮云,T4才是王道,利用T4你完全可以輕松生成屬于自己風(fēng)格的任何類型代碼,在下篇文章會(huì)有實(shí)例展示如何通過(guò)T4連接數(shù)據(jù)庫(kù)自動(dòng)生成POCO類,基本上這個(gè)才是我們用T4的最大意圖,呵呵,在這之前還是老老實(shí)實(shí)看看枯燥乏味的T4基礎(chǔ)知識(shí)吧。
T4 文本模板有兩種類型:設(shè)計(jì)時(shí) T4 文本模板和運(yùn)行時(shí) T4 文本模板(“預(yù)處理過(guò)的”模板)
- 設(shè)計(jì)時(shí)模版
可在應(yīng)用程序中執(zhí)行運(yùn)行時(shí) T4 文本模板(“預(yù)處理過(guò)的”模板)以便生成文本字符串(通常作為其輸出的一部分)。
若要?jiǎng)?chuàng)建運(yùn)行時(shí)模板,請(qǐng)向您的項(xiàng)目中添加“已預(yù)處理的文本模板”文件。?另外,您還可以添加純文本文件并將其“自定義工具”屬性設(shè)置為“TextTemplatingFilePreprocessor”。
有關(guān)更多信息,請(qǐng)參見(jiàn)使用預(yù)處理 T4 文本模板生成運(yùn)行時(shí)文本。?有關(guān)模板語(yǔ)法的更多信息,請(qǐng)參見(jiàn)編寫(xiě) T4 文本模板。
- 運(yùn)行時(shí)模版
在 Visual Studio 中執(zhí)行設(shè)計(jì)時(shí) T4 文本模板,以便定義應(yīng)用程序的部分源代碼和其他資源。
通常,您可以使用讀取單個(gè)輸入文件或數(shù)據(jù)庫(kù)中的數(shù)據(jù)的多個(gè)模板,并生成一些?.cs、.vb?或其他源文件。?每個(gè)模板都生成一個(gè)文件。?在 Visual Studio 或 MSBuild 內(nèi)執(zhí)行它們。
若要?jiǎng)?chuàng)建設(shè)計(jì)時(shí)模板,請(qǐng)向您的項(xiàng)目中添加“文本模板”文件。?另外,您還可以添加純文本文件并將其“自定義工具”屬性設(shè)置為“TextTemplatingFileGenerator”。
有關(guān)更多信息,請(qǐng)參見(jiàn)使用 T4 文本模板生成設(shè)計(jì)時(shí)代碼。?有關(guān)模板語(yǔ)法的更多信息,請(qǐng)參見(jiàn)編寫(xiě) T4 文本模板。
文本模板由以下部件組成:
-
指令?- 控制模板處理方式的元素。
-
文本塊?- 直接復(fù)制到輸出的內(nèi)容。
-
控制塊?- 向文本插入可變值并控制文本的條件或重復(fù)部件的程序代碼。
T4 文本模板指令
- T4模版指令? <#@ template [language="C#"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] #>
- T4 參數(shù)指令 <#@ parameter type="Full.TypeName" name="ParameterName" #>
顧名思義,就是用來(lái)傳參的,應(yīng)該是用在運(yùn)行時(shí)模版的(預(yù)處理模版)
- T4 輸出指令 <#@ output extension=".fileNameExtension" [encoding="encoding"] #>
比較重要的指令,用于設(shè)置輸出文件的后綴名和文件編碼
extension:輸出文件擴(kuò)展名,默認(rèn)為".cs"
encoding:文件編碼,默值為utf-8(這里不能確定,我測(cè)試是utf-8)
- T4 程序集指令 <#@ assembly name="[assembly strong name|assembly file name]" #>
$(SolutionDir):當(dāng)前項(xiàng)目所在解決方案目錄
$(ProjectDir):當(dāng)前項(xiàng)目所在目錄
$(TargetPath):當(dāng)前項(xiàng)目編譯輸出文件絕對(duì)路徑
$(TargetDir):當(dāng)前項(xiàng)目編譯輸出目錄,即web項(xiàng)目的Bin目錄,控制臺(tái)、類庫(kù)項(xiàng)目bin目錄下的debug或release目錄(取決于當(dāng)前的編譯模式)
舉個(gè)例子:比如我們?cè)贒盤(pán)根目錄建立了一個(gè)控制臺(tái)項(xiàng)目TestConsole,解決方案目錄為D:\LzrabbitRabbit,項(xiàng)目目錄為
D:\LzrabbitRabbit\TestConsole,那么此時(shí)在Debug編譯模式下
$(SolutionDir)的值為D:\LzrabbitRabbit
$(ProjectDir)的值為D:\LzrabbitRabbit\TestConsole
$(TargetPath)值為D:\LzrabbitRabbit\TestConsole\bin\Debug\TestConsole.exe
$(TargetDir)值為D:\LzrabbitRabbit\TestConsole\bin\Debug\
- T4 導(dǎo)入指令 <#@ import namespace="namespace" #>
在 Visual Studio T4 文本模板的代碼塊中,import 指令允許您在不提供完全限定名稱的情況下引用另一個(gè)命名空間中的元素。 它等效于 C# 中的 using 或 Visual Basic 中的 imports。默認(rèn)已經(jīng)導(dǎo)入了System命名空間的引用。
- T4 包含指令 <#@ include file="filePath" #>
<#@ assembly name="System.Core.dll" #> <#@ assembly name="System.Data.dll" #> <#@ assembly name="System.Data.DataSetExtensions.dll" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Data" #> <#@ import namespace="System.Data.SqlClient" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO" #>
使用時(shí)只需要使用包含指令引用下即可
<#@ include file="$(ProjectDir)Reference.ttinclude" #>文本塊
文本塊直接向輸出文件插入文本。?文本塊沒(méi)有特殊格式。?例如,下面的文本模板將生成一個(gè)包含單詞“Hello World!”的文本文件:
<#@ output extension=".txt" #> Hello World!?控制塊?
控制塊是用于轉(zhuǎn)換模板的程序代碼節(jié)。 默認(rèn)語(yǔ)言是 C#,但若要使用 Visual Basic,可以在文件開(kāi)頭編寫(xiě)以下指令:
<#@ template language="VB" #>用于編寫(xiě)控制塊代碼的語(yǔ)言與生成的文本的語(yǔ)言無(wú)關(guān)。
標(biāo)準(zhǔn)控制塊
標(biāo)準(zhǔn)控制塊是生成輸出文件部件的程序代碼節(jié)。
在模板文件中,可以混合使用任意數(shù)量的文本塊和標(biāo)準(zhǔn)控制塊。 但是,不能在控制塊中嵌套控制塊。 每個(gè)標(biāo)準(zhǔn)控制塊都以 <# ... #> 符號(hào)分隔。
例如,如果使用下面的控制塊和文本塊,則輸出文件包含行“0, 1, 2, 3, 4 Hello!”:
您可以交錯(cuò)文本和代碼,而不必使用顯式 Write() 語(yǔ)句。 以下示例輸出“Hello!”四次:?
<#for(int i = 0; i < 4; i++){ #> Hello! <#} #>在代碼中,可以使用 Write(); 語(yǔ)句的位置都可以插入文本塊。?
表達(dá)式控制塊
表達(dá)式控制塊計(jì)算表達(dá)式并將其轉(zhuǎn)換為字符串。 該字符串將插入到輸出文件中。
表達(dá)式控制塊以 <#= ... #> 符號(hào)分隔。
例如,如果使用下面的控制塊,則輸出文件包含“5”:?
請(qǐng)注意,開(kāi)始符號(hào)有三個(gè)字符“<#=”。
表達(dá)式可以包含作用域中的任何變量。 例如,下面的塊輸出數(shù)字行:
類功能控制塊
類功能控制塊定義屬性、方法或不應(yīng)包含在主轉(zhuǎn)換中的所有其他代碼。 類功能塊常用于編寫(xiě)幫助器函數(shù)。 通常,類功能塊位于單獨(dú)的文件中,這樣它們可以包含在多個(gè)文本模板中。
類功能控制塊以 <#+ ... #> 符號(hào)分隔,可以簡(jiǎn)單的認(rèn)為<#+ ...#>定義的內(nèi)容為我們的類文件
例如,下面的模板文件聲明并使用一個(gè)方法:
類功能必須編寫(xiě)在文件末尾。 不過(guò),即使 include 指令后跟標(biāo)準(zhǔn)塊和文本,也可以 <#@include#> 包含類功能的文件。
類功能塊可以包含文本塊
可以編寫(xiě)生成文本的方法。 例如:
List of Squares:
將文本生成方法放置在可供多個(gè)模板包含的單獨(dú)文件中,是非常有用的。
嗯,大概的基礎(chǔ)點(diǎn)應(yīng)該就這些了,更多的自己去MSDNhttp://msdn.microsoft.com/zh-cn/library/bb126445詳細(xì)了解吧
這里解釋點(diǎn)容易讓人困惑的地方,我們?cè)赥4模版里面引用的程序集和那些命名空間都是利用T4生成代碼需要使用的,也就是T4模版要用的,和我們要生成的目標(biāo)類毛關(guān)系都沒(méi)有,當(dāng)初為搞清楚這點(diǎn)可是費(fèi)了不精力。T4初看起來(lái)很復(fù)雜,其實(shí)稍微花些心思研究下,主要似乎把MSDN看懂還是很容易學(xué)會(huì)的,一旦掌握了受用無(wú)窮
注:此文章屬懶惰的肥兔原創(chuàng),版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接:http://www.cnblogs.com/lzrabbit/archive/2012/07/15/2591085.html
若您覺(jué)得這篇文章還不錯(cuò)請(qǐng)點(diǎn)擊下右下角的推薦,有了您的支持才能激發(fā)作者更大的寫(xiě)作熱情,非常感謝。
如有問(wèn)題,可以通過(guò)lzrabbit@126.com聯(lián)系我。
#6樓 2012-07-16 11:04 sdf333 有好的T4編輯器嗎?現(xiàn)在純文本寫(xiě)T4很蛋疼 #7樓[樓主] 2012-07-16 11:12 懶惰的肥兔 我現(xiàn)在用T4 Editor,有代碼著色和簡(jiǎn)單的智能提示,一般夠用了總結(jié)
以上是生活随笔為你收集整理的[转]T4模版引擎之基础入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 做梦梦到被猪追是什么意思
- 下一篇: EditPlus自定义模板