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模板中使用预处理器来影响模板本身而不仅仅是模板输出?
在您的示例中,预处理程序指令将注入到生成的输出中.您可能做的是拥有一个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)
我不确定这是否对你有所帮助,但说实话,我在这里用了一些用例.