【问题标题】:Can Conditional compilation symbols be used within T4 templates可以在 T4 模板中使用条件编译符号吗
【发布时间】:2011-09-21 01:14:26
【问题描述】:

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

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

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

我想使用Preprocessor Directives 将这些导入切换到另一组命名空间(与 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
#>

对于上面的示例,无论预处理器指令如何,导入似乎都会在类中创建相应的 using 语句。例如

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

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

【问题讨论】:

    标签: t4 conditional-compilation


    【解决方案1】:

    在您的示例中,预处理器指令被注入到生成的输出中。您可能会做的是拥有一个导入正确命名空间并使用 包含模板代码的 ProductX.tt 文件。

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

    我不确定这是否对您有帮助,但老实说,我在此处的用例上有点挣扎。

    【讨论】:

    • 我们使用这样的“标题”模板来执行此操作,并且发现它运行良好。无法在产品内置的指令周围插入条件。
    • 感谢您的回答。这听起来像是一个很好的解决方法。一旦我得到它的工作,我会把它标记为解决方案。
    【解决方案2】:

    老问题的新想法。

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

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

    【讨论】:

    • 您可以编写一个自定义指令处理器,它本质上是一个自定义包含指令,是的。与标头模板方法相比,这是很多工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多