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

发布于 2024-12-05 18:35:28 字数 1084 浏览 0 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

栀子花开つ 2024-12-12 18:35:28

在您的示例中,预处理器指令被注入到生成的输出中。您可能会做的是拥有一个 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"     #>

我不确定这是否对您有帮助,但说实话,我在使用这里的用例时遇到了一些困难。

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):

<#@ 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"     #>

I am not sure if this helps you but to be honest I am struggling a little bit with the use-case here.

陈甜 2024-12-12 18:35:28

老问题的新想法。

可以使用自定义 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文