条件编译符号可以在 T4 模板中使用吗
我有一个 T4 模板,它与 TextTemplatedFilePreprocessor 一起使用来生成一个类,然后我可以使用该类来生成模板的输出。
在 T4 模板的开头,我导入了几个命名空间。例如,
<#@ import namespace="Company.ProductX.Widgets" #>
<#@ import namespace="Company.ProductX.Services" #>
//...
我想使用 预处理器指令 将这些导入替换为另一组命名空间(它们为 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 模板中使用预处理器来影响模板本身而不仅仅是模板输出?
I have a T4 template that is used with the TextTemplatingFilePreprocessor to generate a class that I can then use to generate the output of the template.
At the start of the T4 template I import several namespaces. E.g.
<#@ import namespace="Company.ProductX.Widgets" #>
<#@ import namespace="Company.ProductX.Services" #>
//...
I'd like to use Preprocessor Directives to switch out these imports with another set of namespaces (which provide the same interfaces but differing functionality to 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
#>
With the above example the imports seem to create the corresponding using statements in the class regardless of the preprocessor directive. E.g.
using Company.ProductX.Widgets
using Company.ProductX.Services
using Company.ProductY.Widgets
using Company.ProductY.Services
Is there another way to use Preprocessors in T4 templates to affect the template itself rather than just the template output?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在您的示例中,预处理器指令被注入到生成的输出中。您可能会做的是拥有一个 ProductX.tt 文件,该文件导入正确的命名空间并使用 <#@ include #>包含模板代码。
像这样的(ProductX.tt):(
ProductY.tt):
我不确定这是否对您有帮助,但说实话,我在使用这里的用例时遇到了一些困难。
In your example the preprocessor directive is injected into the generated output. What you could potentially do is having a ProductX.tt file that imports the correct namespace and uses <#@ include #> to include the template code.
Something like this (ProductX.tt):
(ProductY.tt):
I am not sure if this helps you but to be honest I am struggling a little bit with the use-case here.
老问题的新想法。
可以使用自定义 T4 文本模板指令处理器来传递通过任意代码到T4输出。
自定义指令处理器需要在每台机器上注册才能使用它。
New idea for an old question.
It might be possible to use a Custom T4 Text Template Directive Processor to pass through arbitrary code to the T4 output.
The custom directive processor would need to be registered on each machine to use it.