次の方法で共有


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

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

TextTemplate.exe から引数を取得する

重要

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