次の方法で共有


T4 パラメーター ディレクティブ

更新 : 2011 年 3 月

Visual Studio のテキスト テンプレートでは、外部コンテキストから渡された値から初期化されるテンプレート コード内のプロパティを parameter ディレクティブで宣言します。 テキスト変換を呼び出すコードを作成する場合に、これらの値を設定できます。

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();

TextTemplate.exe からの引数の取得

重要

parameter ディレクティブでは、TextTransform.exe ユーティリティの –a パラメーターに設定された値は取得しません。 これらの値を取得するには、template ディレクティブで hostSpecific="true" を設定し、this.Host.ResolveParameterValue("","","argName") を使用します。

履歴の変更

日付

履歴

理由

2011 年 3 月

親トピックから分離されました。

情報の拡充