程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> T4語法快速入門,t4快速入門

T4語法快速入門,t4快速入門

編輯:關於.NET

T4語法快速入門,t4快速入門


1.什麼是T4?

  T4,即4個T開頭的英文字母組合:Text Template Transformation Toolkit。T4(Text Template Transformation Toolkit)是微軟官方在VisualStudio 2008中開始使用的代碼生成引擎。簡單的說就是可以根據模板生成你想要的文件,可以使類文件,文本文件,HTML等等。

VS本身只提供一套基於T4引擎的代碼生成的執行環境,由下面程序集構成:

Microsoft.VisualStudio.TextTemplating.10.0.dll

Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll

Microsoft.VisualStudio.TextTemplating.Modeling.10.0.dll

Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll

2.vs插件的安裝

T4的編輯工具下載地址http://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html

VS默認的編輯工具無高亮,無提示,錯誤不易定位。 沒這個工具,真心不想寫任何T4代碼。

3.T4初體驗

首先我們新建一個類庫,在添加新項,選擇文本文件,後綴名xx.tt.

<#@ 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; } } View Code
//------------------------------------------------------------------------------
// <博客園-楓伶憶 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的基本語法。

4.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;

 

4.3程序集指令

<#@ 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\

 

4.4導入指令

<#@ 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";
    }
#>

例如在這裡寫一個類,在其他的地方我們可以使用這個類的東西。

 

其實對於“T4模板”的學習,講得最詳細的還是MSDN,下面給出對應的鏈接,可以點開深入的了解。

  • T4 文本模板編寫准則
  • 使用 T4 文本模板生成設計時代碼
  • 演練:使用文本模板生成代碼
  • 生成過程中的代碼生成
  • 文本模板的安全性
  • 使用 TextTransform 實用工具生成文件
  • 使用 T4 文本模板的運行時文本生成
  • 編寫 T4 文本模板
  • T4 文本模板指令
  • T4 模板指令
  • T4 參數指令
  • T4 輸出指令
  • T4 程序集指令
  • T4 導入指令
  • T4 包含指令
  • T4 CleanUpBehavior 指令
  • 文本模板控制塊
  • 文本模板實用工具方法
  • 從文本模板訪問 Visual Studio 或其他主機
  • 在文本模板中使用轉義序列
  • 如何:使用轉義序列從模板生成模板
  • 調試 T4 文本模板
  • T4 文本模板編寫准則
  • 如何:使用文本模板 ...
  • 自定義 T4 文本轉換
  • 文本模板轉換過程
  • 創建自定義 T4 文本模板指令處理器
  • 部署自定義指令處理器
  • 演練:創建自定義指令處理器
  • 在 VS 擴展中調用文本轉換
  • 使用自定義宿主處理文本模板
  • 演練:創建自定義文本模板宿主
  • T4 文本模板的 API 參考
  • 命名空間
  • Microsoft.VisualStudio.TextTemplating
  • Microsoft.VisualStudio.TextTemplating.Modeling
  • Microsoft.VisualStudio.TextTemplating.VSHost

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved