Можно ли использовать условные символы компиляции в шаблонах T4 - PullRequest
6 голосов
/ 21 сентября 2011

У меня есть шаблон T4, который используется с TextTemplatingFilePreprocessor для генерации класса, который я затем могу использовать для генерации выходных данных шаблона.

В начале шаблона 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 Company.ProductX.Widgets
using Company.ProductX.Services
using Company.ProductY.Widgets
using Company.ProductY.Services

Есть ли другой способ использования препроцессоров в шаблонах T4 для воздействия на сам шаблон, а не только на вывод шаблона?

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

В вашем примере директива препроцессора вводится в сгенерированный вывод. Что вы могли бы сделать, так это иметь файл 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 голосов
/ 20 октября 2015

Новая идея для старого вопроса.

Может быть возможно использовать Обработчик пользовательских текстовых шаблонов T4 для передачи произвольного кода на выход T4.

Чтобы использовать его, на каждом компьютере должен быть зарегистрирован процессор пользовательских директив.

...