文本模板由以下部件組成:
1)指令 - 控制模板處理方式的元素。
2)文本塊 - 直接復制到輸出的內容。
3)控制塊 - 向文本插入可變值并控制文本的條件或重復部件的程序代碼。
指令是控制模板處理方式的元素,為模板轉換引擎提供說明。
T4文本模板指令包括: T4模板指令; T4參數指令; T4輸出指令; T4程序集指令; T4導入指令; T4包含指令; T4 CleanUpBehavior 指令及其自定義指令。
指令的語法如下所示:
<#@ DirectiveName [AttributeName = "AttributeValue"] ... #>
【指令通常是模板文件或包含的文件中的第一個元素。 不應將它們放置在代碼塊 <#...#> 內,也不應放置在類功能塊 <#+...#> 之后。】
<#@ template [language="VB"] [hostspecific="true|TrueFromBase"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] [visibility="internal"] [line
- 模版指令中所有特性均為可選的。
- langeuage:輸出語言,有效值C#、VB,默認為C#。
- debug:是否啟用調試,有效值true、false,默認為false。特別說明下這個調試真的不咋地,很容易讓VS崩潰,很雞肋的功能。
- hostspecific:有效值true、false,默認為false。如果將此特性的值設置為 true,則會將名為 Host 的屬性添加到由文本模板生成的類中。 該屬性是對轉換引擎的宿主的引用,并聲明為Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。
- inherits:可以指定模板的程序代碼可以繼承自另一個類,這個類也可以從文本模板生成。目前木有使用過,基本上可以忽略。
- compilerOptions:有效值為任何有效的編譯器選項。基本上可以忽略 。
T4 參數指令:
<#@ parameter type="Full.TypeName" name="ParameterName" #>
- type:有效值是傳遞參數的類型名。
- name:傳遞參數的名。
T4 輸出指令:
<#@ output extension=".fileNameExtension" [encoding="encoding"] #>比較重要的指令,用于設置輸出文件的后綴名和文件編碼。
- extension:輸出文件擴展名,默認為".cs"。
- encoding:文件編碼。
T4 程序集指令:
<#@ assembly name="[assembly strong name|assembly file name]" #>
- 程序集指令相當于VS里面我們添加程序集引用的功能,該指令只有一個參數name,用以指定程序集名稱,如果程序集已經在GAC里面注冊,那么只需要寫上程序集名稱即可,如<#@ assembly name="System.Data.dll" #>,否則需要指定程序集的物理路徑。
- T4模版的程序集引用是完全獨立的,也就是說我們在項目中引用了一些程序集,然后項目中添加了一個T4模版,T4模版所需要的所有程序集引用必須明確的在模版中使用程序集執行引用才可以。
- T4模版自動加載以下程序集Microsoft.VisualStudio.TextTemplating.1*.dll、System.dll、WindowsBase.dll,如果用到了其它的程序集需要顯示的使用程序集添加引用才可以。
- 可以使用 $(variableName) 語法引用 Visual Studio 或 MSBuild 變量(如 $(SolutionDir)),以及使用 %VariableName% 來引用環境變量。介紹幾個常用的$(variableName) 變量:
$(SolutionDir):當前項目所在解決方案目錄
$(ProjectDir):當前項目所在目錄
$(TargetPath):當前項目編譯輸出文件絕對路徑
$(TargetDir):當前項目編譯輸出目錄,即web項目的Bin目錄,控制臺、類庫項目bin目錄下的debug或release目錄(取決于當前的編譯模式)
$(SolutionDir):當前項目所在解決方案目錄
$(ProjectDir):當前項目所在目錄
$(TargetPath):當前項目編譯輸出文件絕對路徑
$(TargetDir):當前項目編譯輸出目錄,即web項目的Bin目錄,控制臺、類庫項目bin目錄下的debug或release目錄(取決于當前的編譯模式)
舉個例子:比如我們在D盤根目錄建立了一個控制臺項目TestConsole,解決方案目錄為D:/LzrabbitRabbit,項目目錄為
D:/LzrabbitRabbit/TestConsole,那么此時在Debug編譯模式下
$(SolutionDir)的值為D:/LzrabbitRabbit
$(ProjectDir)的值為D:/LzrabbitRabbit/TestConsole
$(TargetPath)值為D:/LzrabbitRabbit/TestConsole/bin/Debug/TestConsole.exe
$(TargetDir)值為D:/LzrabbitRabbit/TestConsole/bin/Debug/
舉個例子:比如我們在D盤根目錄建立了一個控制臺項目TestConsole,解決方案目錄為D:/LzrabbitRabbit,項目目錄為
D:/LzrabbitRabbit/TestConsole,那么此時在Debug編譯模式下
$(SolutionDir)的值為D:/LzrabbitRabbit
$(ProjectDir)的值為D:/LzrabbitRabbit/TestConsole
$(TargetPath)值為D:/LzrabbitRabbit/TestConsole/bin/Debug/TestConsole.exe
$(TargetDir)值為D:/LzrabbitRabbit/TestConsole/bin/Debug/
T4 導入指令:
<#@ import namespace="namespace" #>在 Visual Studio T4 文本模板的代碼塊中,import 指令允許您在不提供完全限定名稱的情況下引用另一個命名空間中的元素。 它等效于 C# 中的 using 或 Visual Basic 中的 imports。默認已經導入了System命名空間的引用。
T4 包含指令:
<#@ include file="filePath" #>
- filePath 可以是絕對的,或相對于當前模板文件。
- filePath 可以包括用“%”分隔的環境變量。 例如:<#@ include file="%HOMEPATH%/MyIncludeFile.t4" #>
- 所包含的文件的名稱不必使用擴展名“.tt”。可能需要針對包含的文件使用其他擴展名,例如,“.t4”。 這是因為,在您將 .tt 文件添加到項目中時,Visual Studio 會自動將其“自定義工具”屬性設置為 TextTemplatingFileGenerator。 您通常不希望單獨轉換包含的文件。
- 在處理時,被包含內容就像是包含文本模板的組成部分一樣。 不過,即使 include 指令后為普通文本塊和標準控制塊,也可以包括含有類功能塊 <#+...#> 的文件。
- 包含指令可以提高代碼復用率,比如我們可以將一些常用的程序集、命名空間引用放到一個文件里,使用時僅需要引用下即可,省去了每次都要重新引用一遍的煩惱,如我們建立Reference.ttinclude文件,里面包含了我們平時常用的程序集引用。
<#@ assembly name="System.Core.dll" #>
新聞熱點
疑難解答