可以在T4模板中使用条件编译符号

时间:2011-09-21 01:14:27

标签: t4 conditional-compilation

我有一个与TextTemplatingFilePreprocessor一起使用的T4模板,用于生成一个类,然后我可以用它来生成模板的输出。

在T4模板的开头,我导入了几个名称空间。 E.g。

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

我想使用Preprocessor Directives将这些导入转换为另一组命名空间(它们提供相同的接口,但与ProductX的功能不同)。 E.g。

<#
#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语句。 E.g。

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

是否有另一种方法可以在T4模板中使用预处理器来影响模板本身,而不仅仅是模板输出?

2 个答案:

答案 0 :(得分:5)

在您的示例中,预处理程序指令将注入到生成的输出中。您可能做的是拥有一个ProductX.tt文件,该文件导入正确的命名空间并使用&lt;#@ include#&gt;包含模板代码。

像这样的东西(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"     #>

我不确定这是否对您有所帮助,但说实话,我在这里与用例有点挣扎。

答案 1 :(得分:0)

旧问题的新想法。

可以使用Custom T4 Text Template Directive Processor将任意代码传递给T4输出。

需要在每台机器上注册自定义指令处理器才能使用它。