T4,即4個T開頭的英文字母組合:Text Template Transformation Toolkit。T4(Text Template Transformation Toolkit)是微軟官方在VisualStudio 2008中開始使用的代碼生成引擎。簡單的說就是能夠根據模板生成你想要的文件,可使類文件,文本文件,HTML等等。html
VS自己只提供一套基於T4引擎的代碼生成的執行環境,由下面程序集構成:web
Microsoft.VisualStudio.TextTemplating.10.0.dllc#
Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll安全
Microsoft.VisualStudio.TextTemplating.Modeling.10.0.dllide
Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll工具
T4的編輯工具下載地址http://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html學習
VS默認的編輯工具無高亮,無提示,錯誤不易定位。 沒這個工具,真心不想寫任何T4代碼。ui
首先咱們新建一個類庫,在添加新項,選擇文本文件,後綴名xx.tt.spa
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> //------------------------------------------------------------------------------ // <博客園-楓伶憶 http://www.cnblogs.com/fenglingyi/> // 此代碼由T4模板自動生成 // 生成時間 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#> by 楓伶憶 // 對此文件的更改可能會致使不正確的行爲,而且若是從新生成代碼,這些更改將會丟失。 // QQ:549387177 // <博客園-楓伶憶 http://www.cnblogs.com/fenglingyi/> //------------------------------------------------------------------------------ using System; public class UserEntity { public string F_Id { get; set; } public string F_Account { get; set; } public string F_RealName { get; set; } public string F_NickName { get; set; } public string F_HeadIcon { get; set; } public bool? F_Gender { get; set; } public DateTime? F_Birthday { get; set; } public string F_MobilePhone { get; set; } public string F_Email { get; set; } public string F_WeChat { get; set; } public string F_ManagerId { get; set; } public int? F_SecurityLevel { get; set; } public string F_Signature { get; set; } public string F_OrganizeId { get; set; } public string F_DepartmentId { get; set; } public string F_RoleId { get; set; } public string F_DutyId { get; set; } public bool? F_IsAdministrator { get; set; } public int? F_SortCode { get; set; } public bool? F_DeleteMark { get; set; } public bool? F_EnabledMark { get; set; } public string F_Description { get; set; } public DateTime? F_CreatorTime { get; set; } public string F_CreatorUserId { get; set; } public DateTime? F_LastModifyTime { get; set; } public string F_LastModifyUserId { get; set; } public DateTime? F_DeleteTime { get; set; } public string F_DeleteUserId { get; set; } }
//------------------------------------------------------------------------------ // <博客園-楓伶憶 http://www.cnblogs.com/fenglingyi/> // 此代碼由T4模板自動生成 // 生成時間 2016-10-02 07:09:29 by 楓伶憶 // 對此文件的更改可能會致使不正確的行爲,而且若是從新生成代碼,這些更改將會丟失。 // QQ:549387177 // <博客園-楓伶憶 http://www.cnblogs.com/fenglingyi/> //------------------------------------------------------------------------------ using System; public class UserEntity { public string F_Id { get; set; } public string F_Account { get; set; } public string F_RealName { get; set; } public string F_NickName { get; set; } public string F_HeadIcon { get; set; } public bool? F_Gender { get; set; } public DateTime? F_Birthday { get; set; } public string F_MobilePhone { get; set; } public string F_Email { get; set; } public string F_WeChat { get; set; } public string F_ManagerId { get; set; } public int? F_SecurityLevel { get; set; } public string F_Signature { get; set; } public string F_OrganizeId { get; set; } public string F_DepartmentId { get; set; } public string F_RoleId { get; set; } public string F_DutyId { get; set; } public bool? F_IsAdministrator { get; set; } public int? F_SortCode { get; set; } public bool? F_DeleteMark { get; set; } public bool? F_EnabledMark { get; set; } public string F_Description { get; set; } public DateTime? F_CreatorTime { get; set; } public string F_CreatorUserId { get; set; } public DateTime? F_LastModifyTime { get; set; } public string F_LastModifyUserId { get; set; } public DateTime? F_DeleteTime { get; set; } public string F_DeleteUserId { get; set; } }
上面的T4模板生成的代碼類文件就是這樣。T4所能作的事情遠遠超出這些,在這裏咱們首先了解一下T4的基本語法。插件
細心的朋友剛纔確定看到了模板中的一些奇怪的語法,說它奇怪的是T4語法和c#語法相似,可是有不一樣於c#語法。
T4語法主要包括三類:1指令 2文本塊 3指令塊
<# 標準控制塊 #> 能夠包含語句。 <#= 表達式控制塊 #> 能夠包含表達式。 <#+ 類特徵控制塊 #> 能夠包含方法、字段和屬性,就像一個類的內部
指令主要包括template, output, assembly, import, include等類型
在這裏是指令T4語法以<#開頭結尾
<#@ 指令 屬性=「值」#>
第一種指令集
4.1模板指令
<#@ template debug="false" hostspecific="false" language="C#" #>
4.1.1 langeuage:輸出語言,有效值C#、VB,默認爲C#
4.1.2 debug:是否啓用調試,有效值true、false,默認爲false。
4.1.3 hostspecific:有效值true、false,默認爲false。若是將此特性的值設置爲 true,則會將名爲 Host 的屬性添加到由文本模板生成的類中。 該屬性是對轉換引擎的宿主的引用,並聲明爲Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。
4.1.4 inherits:能夠指定模板的程序代碼能夠繼承自另外一個類,這個類也能夠從文本模板生成。目前木有使用過,基本上能夠忽略
4.2輸出指令
<#@ output extension=".cs" #>
4.2.1 告訴T4引擎生成文件的後綴名是.cs;
<#@ assembly name="System"#>
4.3.1 告訴T4引擎編譯運行時引用System程序集
$(SolutionDir):當前項目所在解決方案目錄
$(ProjectDir):當前項目所在目錄
$(TargetPath):當前項目編譯輸出文件絕對路徑
$(TargetDir):當前項目編譯輸出目錄,即web項目的Bin目錄,控制檯、類庫項目bin目錄下的debug或release目錄(取決於當前的編譯模式)
舉個例子:好比咱們在D盤根目錄創建了一個控制檯項目MyTest,解決方案目錄爲D:\Feng,項目目錄爲
D:\Feng\MyTest,那麼此時在Debug編譯模式下
$(SolutionDir)的值爲D:\Feng
$(ProjectDir)的值爲D:\Feng\MyTest
$(TargetPath)值爲D:\Feng\MyTest\bin\Debug\MyTest.exe
$(TargetDir)值爲D:\Feng\MyTest\bin\Debug\
<#@ import namespace="System.Data"#>
4.4.1告訴T4引擎編譯運行時引用某個名稱空間。在 Visual Studio T4 文本模板的代碼塊中,import 指令容許您在不提供徹底限定名稱的狀況下引用另外一個命名空間中的元素。 它等效於 C# 中的 using 或 Visual Basic 中的 imports。默認已經導入了System命名空間的引用。
4.5包含指令
<#@ include file="Base.ttinclude"#>
4.5.1 運行時引用某個文件,相似於JS的引用。
4.5.2 包含指令能夠提升代碼複用率,好比咱們能夠將一些經常使用的程序集、命名空間引用放到一個文件裏,使用時僅須要引用下便可,省去了每次都要從新引用一遍的煩惱,如咱們創建Reference.ttinclude文件,裏面包含了咱們平時經常使用的程序集引用。
<#@ 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" #>
使用時只須要使用包含指令引用下便可
<#@ include file="$(ProjectDir)Reference.ttinclude" #>
4.6 參數指令
<#@ parameter type="string" name="ParameterName" #>
顧名思義就是定義一個參數在其餘的地方使用。
第二種 文本塊
文本塊直接向輸出文件插入文本。 文本塊沒有特殊格式,就像咱們剛纔初體驗中寫的類同樣。
第三種 指令塊
主要用於控制文本的輸出。在控制塊能夠寫任意的C#代碼。
標準控制塊:
<# for(int i = 0; i < 4; i++) { #> Hello World! <# } #>
表達式控制塊:
<#= 1 + 1 #>
類控制塊:
<#+ public class config { public static readonly string ConnectionString = "Data Source=(local);Initial Catalog=NFineBase;User ID=sa;Password=hjf19870810;"; public static readonly string DbDatabase = "NFineBase"; public static readonly string TableName = "Sys_Test"; } #>
例如在這裏寫一個類,在其餘的地方咱們可使用這個類的東西。