Можно ли использовать символы условной компиляции в шаблонах T4

У меня есть шаблон 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, чтобы повлиять на сам шаблон, а не только на вывод шаблона?


person Daniel Ballinger    schedule 21.09.2011    source источник


Ответы (2)


В вашем примере директива препроцессора вводится в сгенерированный вывод. Потенциально вы можете создать файл 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"     #>

Я не уверен, поможет ли это вам, но, честно говоря, я немного борюсь с этим вариантом использования.

person Just another metaprogrammer    schedule 21.09.2011
comment
Мы используем такие шаблоны «заголовков» для этого и считаем, что они работают достаточно хорошо. Невозможно вставить условные обозначения вокруг директив, встроенных в продукт. - person GarethJ; 22.09.2011
comment
Спасибо за ответ. Это звучит как хорошая работа вокруг. Как только я заработаю, я отмечу это как решение. - person Daniel Ballinger; 23.09.2011

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

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

Пользовательский процессор директив должен быть зарегистрирован на каждой машине, чтобы использовать его.

person Daniel Ballinger    schedule 19.10.2015
comment
Да, вы могли бы написать собственный обработчик директив, который по сути был бы пользовательской директивой включения. Однако это требует много работы по сравнению с подходом с использованием шаблона заголовка. - person GarethJ; 22.10.2015