次の方法で共有


カスタム T4 テキスト テンプレート ディレクティブ プロセッサを作成する

テキスト テンプレート変換プロセスは、テキスト テンプレート ファイルを入力として受け取り、出力としてテキスト ファイルを生成します。 テキスト テンプレート変換エンジンはプロセスを制御し、エンジンはテキスト テンプレート変換ホストと 1 つ以上のテキスト テンプレート ディレクティブ プロセッサと対話してプロセスを完了します。 詳細については、「 テキスト テンプレート変換プロセス」を参照してください。

カスタム ディレクティブ プロセッサを作成するには、 DirectiveProcessor または RequiresProvidesDirectiveProcessorから継承するクラスを作成します。

これら 2 つの違いは、 DirectiveProcessor は、ユーザーからパラメーターを取得し、テンプレート出力ファイルを生成するコードを生成するために必要な最小限のインターフェイスを実装することです。 RequiresProvidesDirectiveProcessor は、requires/provides 設計パターンを実装します。 RequiresProvidesDirectiveProcessor は、 requiresprovidesの 2 つの特別なパラメーターを処理します。 たとえば、カスタム ディレクティブ プロセッサは、ユーザーからのファイル名を受け入れ、ファイルを開いて読み取り、ファイルのテキストを fileText という名前の変数に格納します。 RequiresProvidesDirectiveProcessor クラスのサブクラスは、ユーザーのファイル名を requires パラメーターの値として受け取り、テキストを provides パラメーターの値として格納する変数の名前を受け取る場合があります。 このプロセッサはファイルを開いて読み取り、指定された変数にファイルのテキストを格納します。

Visual Studio でテキスト テンプレートからカスタム ディレクティブ プロセッサを呼び出す前に、それを登録する必要があります。

レジストリ キーを追加する方法の詳細については、「 カスタム ディレクティブ プロセッサの展開」を参照してください。

カスタム ディレクティブ

カスタム ディレクティブは次のようになります。

<#@ MyDirective Processor="MyDirectiveProcessor" parameter1="value1" ... #>

テキスト テンプレートから外部データまたはリソースにアクセスする場合は、カスタム ディレクティブ プロセッサを使用できます。

異なるテキスト テンプレートは、1 つのディレクティブ プロセッサが提供する機能を共有できるため、ディレクティブ プロセッサはコードを再利用する方法を提供します。 組み込みの include ディレクティブは、コードを分解してさまざまなテキスト テンプレート間で共有するために使用できるため、似ています。 違いは、 include ディレクティブが提供する機能はすべて固定されており、パラメーターを受け入れないということです。 テキスト テンプレートに共通の機能を提供し、テンプレートがパラメーターを渡せるようにする場合は、カスタム ディレクティブ プロセッサを作成する必要があります。

カスタム ディレクティブ プロセッサの例を次に示します。

  • パラメーターとしてユーザー名とパスワードを受け取るデータベースからデータを返すディレクティブ プロセッサ。

  • ファイルの名前をパラメーターとして受け入れるファイルを開いて読み取るディレクティブ プロセッサ。

カスタム ディレクティブ プロセッサの主要部分

ディレクティブ プロセッサを開発するには、 DirectiveProcessor または RequiresProvidesDirectiveProcessorから継承するクラスを作成する必要があります。

実装する必要がある最も重要な DirectiveProcessor メソッドは次のとおりです。

  • bool IsDirectiveSupported(string directiveName) - ディレクティブ プロセッサが名前付きディレクティブを処理できる場合は、 true を返します。

  • void ProcessDirective (string directiveName, IDictionary<string, string> arguments) - テンプレート エンジンは、テンプレート内のディレクティブが出現するたびにこのメソッドを呼び出します。 プロセッサによって結果が保存されます。

ProcessDirective() のすべての呼び出しの後、テンプレート エンジンは次のメソッドを呼び出します。

  • string[] GetReferencesForProcessingRun() - テンプレート コードに必要なアセンブリの名前を返します。

  • string[] GetImportsForProcessingRun() - テンプレート コードで使用できる名前空間を返します。

  • string GetClassCodeForProcessingRun() - テンプレート コードで使用できるメソッド、プロパティ、およびその他の宣言のコードを返します。 これを行う最も簡単な方法は、C# または Visual Basic コードを含む文字列をビルドすることです。 任意の CLR 言語を使用するテンプレートからディレクティブ プロセッサを呼び出すことができるようにするには、ステートメントを CodeDom ツリーとして構築し、テンプレートで使用される言語でツリーをシリアル化した結果を返します。

  • 詳細については、「 チュートリアル: カスタム ディレクティブ プロセッサの作成」を参照してください。