建議使用 Visual Studio 2017

T4 參數指示詞

 

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

在 Visual Studio 文字範本中,parameter 指示詞會在範本程式碼中宣告從外部內容傳入之值初始化的屬性。 如果您撰寫叫用文字轉換的程式碼,就可以設定這些值。

<#@ parameter type="Full.TypeName" name="ParameterName" #>  

parameter 指示詞會在範本程式碼中宣告從外部內容傳入之值初始化的屬性。 如果您撰寫叫用文字轉換的程式碼,就可以設定這些值。 這些值可以透過 Session 字典或 CallContext 加以傳遞。

您可以宣告任何可遠端處理之型別的參數。 也就是說,型別必須使用 SerializableAttribute 宣告或型別必須衍生自 MarshalByRefObject。 這樣參數值就能被傳入處理範本的 AppDomain。

例如,您可以撰寫具有下列內容的文字範本:

<#@ template language="C#" #>  
  
<#@ parameter type="System.Int32" name="TimesToRepeat" #>  
  
<# for (int i = 0; i < TimesToRepeat; i++) { #>  
Line <#= i #>  
<# } #>  
  

如果撰寫功能表命令或事件處理常式這類 Visual Studio 擴充功能,可以使用文字範本化服務來處理範本:

// Get a service provider – how you do this depends on the context:  
IServiceProvider serviceProvider = dte; // or dslDiagram.Store, for example   
// Get the text template service:  
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;  
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;  
// Create a Session in which to pass parameters:  
host.Session = host.CreateSession();  
// Add parameter values to the Session:  
session["TimesToRepeat"] = 5;  
// Process a text template:  
string result = t4.ProcessTemplate("MyTemplateFile.t4",  
  System.IO.File.ReadAllText("MyTemplateFile.t4"));  
  

您也可以透過 CallContext 將值當做邏輯資料傳遞。

下列範例會使用兩個方法傳遞值:

ITextTemplating t4 = this.Store.GetService(typeof(STextTemplating)) as ITextTemplating;  
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;  
host.Session = host.CreateSession();  
// Pass a value in Session:  
host.Session["p1"] = 32;  
// Pass another value in CallContext:  
System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("p2", "test");  
  
// Process a small template inline:  
string result = t4.ProcessTemplate("",   
   "<#@parameter type=\"System.Int32\" name=\"p1\"#>"  
 + "<#@parameter type=\"System.String\" name=\"p2\"#>"  
 + "Test <#=p1#> <#=p2#>");  
  
// Result value is:  
//     Test 32 test  
  

通常不需要搭配執行階段 (前置處理過的) 文字範本使用 <#@parameter#> 指示詞。 反之,只要為產生的程式碼定義額外的建構函式或可設定的屬性,透過這兩種方式即可傳遞參數值。 如需詳細資訊,請參閱使用 T4 文字範本在執行階段產生文字

但是,如果要在執行階段範本中使用 <#@parameter>,可以使用 Session 字典將值傳遞給該範本。 例如,假設您建立一個檔案做為前置處理過的範本,叫做 PreTextTemplate1。 您可以使用下列程式碼,在程式中叫用這個範本。

PreTextTemplate1 t = new PreTextTemplate1();  
t.Session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession();  
t.Session["TimesToRepeat"] = 5;  
// Add other parameter values to t.Session here.  
t.Initialize(); // Must call this to transfer values.  
string resultText = t.TransformText();  
  

System_CAPS_ICON_important.jpg 重要

parameter 指示詞並不會擷取 TextTransform.exe 公用程式之 –a 參數中設定的值。 若要取得那些值,請在 template 指示詞中設定hostSpecific="true",並使用 this.Host.ResolveParameterValue("","","argName")

顯示: