建議使用 Visual Studio 2017

如何 ... 使用文字範本

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

Visual Studio 的文字範本提供實用的方法,協助您產生任何種類的文字。 使用文字範本,可以在執行階段產生文字做為應用程式的一部分,而在設計階段產生部分的專案程式碼。 本主題概述最常見的「如何...?」問題集。

在本主題中,前面加上項目符號的答案為替代的建議。

如需文字範本的一般簡介,請參閱程式碼產生和 T4 文字範本

產生我的應用程式程式碼的一部分

我有以檔案或資料庫為形式的組態或「模型」(Model)。 我的程式碼的一個或多個部分相依於該模型。

在執行階段產生檔案,將資料傳入範本

在執行階段,我的應用程式產生像報表這類的文字檔,其中混合了標準文字與資料。 我想要避免撰寫很多的 write 陳述式。

  • 將執行階段文字範本新增至您的專案。 此範本會在程式碼中建立一個類別,您可以將這個類別加以具現化並用來產生文字。 您可以透過建構函式參數將資料傳遞給這個類別。 如需詳細資訊,請參閱使用 T4 文字範本在執行階段產生文字

  • 如果您要從只能在執行階段使用的範本產生文字,可以使用標準文字範本。 如果您要撰寫 Visual Studio 擴充功能,可以叫用文字範本化服務。 如需詳細資訊,請參閱叫用 VS 擴充功能中的文字轉換。 在其他內容中,您可以使用文字範本化引擎。 如需詳細資訊,請參閱 Microsoft.VisualStudio.TextTemplating.Engine

    使用 <#@parameter#> 指示詞,可以將參數傳遞給這些範本。 如需詳細資訊,請參閱T4 參數指示詞

從範本讀取其他專案檔

若要從同一個 Visual Studio 專案讀取檔案做為範本:

  • hostSpecific="true" 插入 <#@template#> 指示詞。

    在程式碼中,使用 this.Host.ResolvePath(filename) 取得檔案的完整路徑。

從範本叫用方法

例如,如果方法已經存在於標準 .NET Framework 類別中:

  • 使用 <#@assembly#> 指示詞載入組件,並使用 <#@import#> 設定命名空間內容。 如需詳細資訊,請參閱 T4 匯入指示詞

    如果您經常使用同一組 assembly 和 import 指示詞,請考慮撰寫指示詞處理器。 您可以在每個範本中叫用指示詞處理器,它會載入組件和模型檔案並設定命名空間內容。 如需詳細資訊,請參閱建立自訂 T4 文字範本指示詞處理器

如果您要自己撰寫方法:

  • 如果您正在撰寫的執行階段文字範本,寫入具有相同的名稱,為您的執行階段文字範本的部分類別定義。 將其他方法加入這個類別中。

  • 撰寫 <#+ ... #> 類別功能控制區塊,您可以在該區塊中宣告方法、屬性和私用類別。 文字範本編譯時會轉換成類別。 <#...#> 標準控制區塊和文字會轉換成單一方法,而類別功能區塊會插入其中做為個別成員。 如需詳細資訊,請參閱文字範本控制區塊

    定義為類別功能的方法也可以包含內嵌文字區塊。

    請考慮將類別功能放在另一個檔案,您可以將它 <#@include#> 至一個或多個範本檔。

  • 在不同的組件 (類別庫) 中撰寫方法,再從範本加以呼叫。 使用 <#@assembly#> 指示詞載入組件,並使用 <#@import#> 設定命名空間內容。 請注意,為了在偵錯時重建組件,您可能必須停止 Visual Studio,然後再重新啟動。 如需詳細資訊,請參閱T4 文字範本指示詞

從一個模型結構描述產生多個檔案

如果您經常從具有相同 XML 或資料庫結構描述的模型產生檔案:

  • 考慮撰寫指示詞處理器。 這可讓您以單一自訂指示詞來取代每個範本中的多個 assembly 陳述式和 import 陳述式。 指示詞處理器也可以載入和剖析模型檔。 如需詳細資訊,請參閱建立自訂 T4 文字範本指示詞處理器

從複雜模型產生檔案

  • 考慮建立網域指定的語言 (Domain-Specific Language,DSL) 來表示模型。 這讓撰寫範本變得更加容易,因為您會使用可反映模型項目名稱的型別和屬性。 您不必剖析檔案或巡覽 XML 節點。 例如:

    foreach (Book book in this.Library) { ... }

    如需詳細資訊,請參閱開始使用定義域專屬語言從網域指定的語言產生程式碼

  • 考慮從 UML 模型產生程式碼。 程式碼不一定要直接反映 UML。 例如,您不必為 UML 模型中的每個類別產生類別。 您可以改用 UML 類別圖表來表示網站,然後從每個 UML 類別產生網頁。 選擇最貼近您需求的圖表類型。 例如,選擇活動圖表來表示任何類型的工作流程。 您可以定義造型,以便將適合應用程式的資訊加入每種類型的項目中。

    從 UML 模型產生,可讓您以圖表形式繪製和編輯模型,而不必自行設計圖表類型,就像 DSL 一樣。

    如需詳細資訊,請參閱建立應用程式模型透過 UML 模型產生檔案

從 Visual Studio 取得資料

若要使用 Visual Studio 中提供的服務,請設定 hostSpecific 屬性並載入 EnvDTE 組件。 例如:

<#@ template hostspecific="true" language="C#" #>  
<#@ output extension=".txt" #>  
<#@ assembly name="EnvDTE" #>  
<#  
  IServiceProvider serviceProvider = (IServiceProvider)this.Host;  
  EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetService(typeof(EnvDTE.DTE));  
#>  
  
Number of projects in this VS solution:  <#= dte.Solution.Projects.Count #>  
  

在建置流程中執行範本

開始撰寫文字範本的最佳方法為何?

  1. 撰寫產生的檔案的特定範例。

  2. 使它變為文字範本,方式是插入 <#@template #> 指示詞和那些載入輸入檔案或模型所需的指示詞與程式碼。

  3. 採漸進方式以運算式和程式碼區塊取代檔案的組成部分。

什麼是「模型」?

  • 就是範本讀取的輸入, 其形式可以是檔案或資料庫。 模型可以是 XML、Visio 繪圖、網域指定的語言 (DSL)、UML 模型或純文字, 而且可以分散至數個檔案。 通常多個範本都會讀取一個模型。

    「模型」一詞的含意是,它比產生的程式碼或其他檔案更直接呈現商務的某些層面。 例如,它能呈現產生的軟體將監督的通訊網路計劃。

使用文字範本的好處為何?

您通常會從一個模型產生多個程式碼或其他檔案。 模型比產生的程式碼更直接呈現需求。 它省略實作的細節並按照需求撰寫,而非程式碼。 當需求改變時 (需求常是如此),您可以更新模型,此做法比更新程式碼的不同組成部分更輕鬆地、更可靠。

因此,對敏捷式開發方法而言,程式碼產生是很重要的工具。

文字範本有哪些「最佳做法」?

「T4」是什麼?

  • 就是此處所述的 Visual Studio 文字範本功能的另一個名稱。 舊版未發行,指的是「文字範本轉換」(Text Template Transformation) 的縮寫。
顯示: