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

Dan*_*ger 6 t4 conditional-compilation

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

在T4模板的开头,我导入了几个名称空间.例如

<#@ import namespace="Company.ProductX.Widgets" #>
<#@ import namespace="Company.ProductX.Services" #>
//...
Run Code Online (Sandbox Code Playgroud)

我想使用预处理程序指令将这些导入与另一组命名空间(它们提供相同的接口但与ProductX具有不同的功能)相关联.例如

<#
#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
#>
Run Code Online (Sandbox Code Playgroud)

使用上面的示例,无论预处理程序指令如何,导入似乎都会在类中创建相应的using语句.例如

using Company.ProductX.Widgets
using Company.ProductX.Services
using Company.ProductY.Widgets
using Company.ProductY.Services
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*mer 5

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

像这样的东西(ProductX.tt):

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

<#@ include file="TheTemplateCode.ttinclude"     #>
Run Code Online (Sandbox Code Playgroud)

(ProductY.tt):

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

<#@ include file="TheTemplateCode.ttinclude"     #>
Run Code Online (Sandbox Code Playgroud)

我不确定这是否对你有所帮助,但说实话,我在这里用了一些用例.