控制區塊可讓您在文字範本中撰寫程式碼,以改變輸出。 控制塊分為三種,其區別在於其左括號:
<# Standard control blocks #>可以包含陳述式。<#= Expression control blocks #>可以包含運算式。<#+ Class feature control blocks #>可以包含方法、欄位和屬性。
標準控制區塊
標準控制區塊包含陳述式。 例如,下列標準區塊會取得 XML 文件中所有屬性的名稱:
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System.Xml" #>
<#
List<string> allAttributes = new List<string>();
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"E:\CSharp\Overview.xml");
XmlAttributeCollection attributes = xDoc.Attributes;
if (attributes.Count > 0)
{
foreach (XmlAttribute attr in attributes)
{
allAtributes.Add(attr.Name);
}
}
#>
您可以在複合陳述式中內嵌純文字,例如 if 或 for。 例如,此片段會在每個迴圈反覆專案中產生輸出行:
<#
foreach (XmlAttribute attr in attributes)
{
#>
Found another one!
<#
allAtributes.Add(attr.Name);
}
#>
警告
一律使用 {...} 來分隔包含內嵌純文字的巢狀陳述式。 下列範例可能無法正常運作:
<# if (ShouldPrint) #> Some text. -- WRONG
相反地,您應該包含 {braces},如下所示:
<#
if (ShouldPrint)
{ // "{" REQUIRED
#>
Some text.
<#
}
#>
表達式控制區塊
運算式控制區塊(expression control blocks)被用於含有將字串寫入輸出檔案的程式碼。 例如,在上述範例中,您可以修改程式碼區塊,將屬性名稱列印到輸出檔案中,如下所示:
<#
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"E:\CSharp\Overview.xml");
XmlAttributeCollection attributes = xDoc.Attributes;
if (attributes != null)
{
foreach (XmlAttribute attr in attributes)
{
#><#= attr.Name #><#
}
}
#>
類別功能控制區塊
您可以使用類別功能控制區塊,將方法、屬性、欄位,甚至巢狀類別新增至文字範本。 類別功能區塊最常見的用途是為文字範本其他部分的程式碼提供協助程式函式。 例如,下列類別功能區塊會將屬性名稱的第一個字母大寫 (或者,如果名稱包含空格,則會將每個單字的第一個字母大寫):
<#@ import namespace="System.Globalization" #>
<#+
private string FixAttributeName(string name)
{
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name);
}
#>
備註
類別功能控制區塊後面不得跟隨相同範本檔案中的標準控制區塊。 不過,此限制不適用於使用 <#@include#> 指引的結果。 每個包含的檔案都可以有標準區塊,後面接著類別功能區塊。
您可以建立函數,透過將文字和運算式區塊內嵌在類別特徵控制區塊內來產生輸出。 例如:
<#+
private void OutputFixedAttributeName(string name)
{
#>
Attribute: <#= CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name) #>
<#+ // <<< Notice that this is also a class feature block.
}
#>
您可以從標準區塊或另一個類別功能區塊呼叫此函式:
<# foreach (Attribute attribute in item.Attributes)
{
OutputFixedAttributeName(attribute.Name);
}
#>
如何使用控制塊
單一範本中所有標準和運算式控制區塊中的所有程式碼 (包括包含範本中的所有程式碼) 會合併,以形成 TransformText() 產生程式碼的方法。 如需有關使用 include 指令包含其他文字範本的詳細資訊,請參閱 T4 文字範本指令。
使用控制區塊時,您應該記住下列考量:
語言。 您可以在文字範本中使用 C# 或 Visual Basic 程式碼。 預設語言是 C#,但您可以使用指示詞
template的language參數來指定 Visual Basic。 (如需有關template指令的詳細資訊,請參閱 T4 文字範本指令。)您在控制區塊中使用的語言與您在文字範本中產生的文字的語言或格式無關。 您可以使用 Visual Basic 程式碼產生 C#,反之亦然。
在給定的文字範本中,您只能使用一種語言,包括您包含在指引中的所有
include文字範本。局部變數。 由於文字範本中標準和運算式控制區塊中的所有程式碼都是以單一方法產生,因此您應該確定與局部變數的名稱沒有衝突。 如果您要包含其他文字範本,則必須確定變數名稱在所有包含的範本中都是唯一的。 確保這一點的一種方法是在每個局部變數名稱中新增一個字串,以識別宣告它的文字範本。
在宣告區域變數時,將局部變數初始化為合理的值也是一個好主意,特別是當您包含多個文字範本時。
控制塊的嵌套。 控制區塊不得相互嵌套。 您必須一律先終止給定的控制區塊,才能開啟另一個控制區塊。 例如,以下說明如何將運算式區塊中的某些文字列印為標準控制區塊的一部分。
<# int x = 10; while (x-- > 0) { #> <#= x #> <# } #>重構。 為了讓文字範本保持簡短且易於理解,強烈建議您將可重複使用的程式碼分解為類別功能區塊中的協助程式函式,或建立繼承自 Microsoft.VisualStudio.TextTemplating.TextTransformation 類別的文字範本類別,以避免重複的程式碼。