2011-09-21 10 views
5

私は、テンプレートの出力を生成するために使用できるクラスを生成するためにTextTemplatingFilePreprocessorで使用されるT4テンプレートを持っています。条件付きコンパイルシンボルをT4テンプレート内で使用することができます

T4テンプレートの最初に、いくつかの名前空間をインポートします。例えば。

<#@ import namespace="Company.ProductX.Widgets" #> 
<#@ import namespace="Company.ProductX.Services" #> 
//... 

Iは、(同じインターフェイスしかしProductXに異なる機能を提供する)名前空間の別のセットでこれらの輸入を切り替えることPreprocessor Directivesを使用したいです。例えば。

<# 
#if(ProductX) 
{ 
#> 
    <#@ import namespace="Company.ProductX.Widgets" #> 
    <#@ import namespace="Company.ProductX.Services" #> 
    //... 
<# 
} 
#endif 
#> 
<# 
#if(ProductY) 
{ 
#> 
    <#@ import namespace="Company.ProductY.Widgets" #> 
    <#@ import namespace="Company.ProductY.Services" #> 
    //... 
<# 
} 
#endif 
#> 

上記の例では、輸入を問わず、プリプロセッサディレクティブのクラスに対応するusingステートメントを作成するように見えます。例えば。

using Company.ProductX.Widgets 
using Company.ProductX.Services 
using Company.ProductY.Widgets 
using Company.ProductY.Services 

テンプレート自体だけではなく、テンプレートの出力に影響を与えるようにT4テンプレートでプリプロセッサを使用するための別の方法はありますか?

答えて

5

この例では、プリプロセッサディレクティブが生成された出力に挿入されています。可能なことは、正しい名前空間をインポートするProductX.ttファイルを持ち、<#@ include#>を使用してテンプレートコードを含めることです。

このような何か(ProductX.tt):

<#@ import namespace="Company.ProductX.Widgets" #> 
<#@ import namespace="Company.ProductX.Services" #> 

<#@ include file="TheTemplateCode.ttinclude"  #> 

(ProductY.tt):

<#@ import namespace="Company.ProductY.Widgets" #> 
<#@ import namespace="Company.ProductY.Services" #> 

<#@ include file="TheTemplateCode.ttinclude"  #> 

私はこれがあなたを助けますが、正直に言うならば、私は少し苦労していますわかりませんここではユースケースを使用しています。

+0

このような「ヘッダー」テンプレートを使用して、これを実行しても問題はありません。製品に組み込まれているディレクティブの周囲に条件文を挿入する方法はありません。 – GarethJ

+0

答えをありがとう。これは良い仕事のように聞こえる。私がそれを働かせたら、それを解決策としてマークします。 –

0

古い質問の新しいアイデア。

Custom T4 Text Template Directive Processorを使用して、任意のコードをT4出力に渡すことができます。

カスタムディレクティブプロセッサを使用するには、各マシンにカスタムディレクティブプロセッサを登録する必要があります。

+1

本質的にカスタムインクルードディレクティブであるカスタムディレクティブプロセッサを書くことができます。しかし、ヘッダーテンプレートアプローチと比較して多くの作業があります。 – GarethJ

関連する問題