2011-09-21 65 views
5

我有一个T4模板,与TextTemplatingFilePreprocessor一起使用来生成一个类,然后我可以使用它生成模板的输出。可以在T4模板中使用条件编译符号

在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模板中的预处理器来影响模板本身,而不仅仅是模板输出?

回答

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

我们使用这样的'header'模板来做到这一点,并发现它工作得很好。没有办法在产品内置的指令周围插入条件。 – GarethJ

+0

感谢您的回答。这听起来像一个很好的工作。一旦我得到它的工作,我会将其标记为解决方案。 –

0

旧的问题的新想法。

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

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

+1

你可以编写一个自定义指令处理器,它基本上是一个自定义包含指令,是的。尽管如此,与标题模板方法相比,这是一项很多工作。 – GarethJ