2011-09-21 10 views
5

Mam szablon T4, który jest używany z TextTemplatingFilePreprocessor do generowania klasy, którą następnie można użyć do wygenerowania danych wyjściowych szablonu.Czy w szablonach T4 można używać warunkowych symboli kompilacji

Na początku szablonu T4 importuję kilka przestrzeni nazw. Na przykład.

<#@ import namespace="Company.ProductX.Widgets" #> 
<#@ import namespace="Company.ProductX.Services" #> 
//... 

Chciałbym użyć Preprocessor Directives aby przełączyć się na ten przywóz z innego zestawu nazw (które świadczą te same interfejsy, ale różniących funkcjonalność ProduktX). Na przykład.

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

W powyższym przykładzie import wydaje się tworzyć odpowiednie instrukcje użycia w klasie, niezależnie od dyrektywy preprocesora. Na przykład.

Czy istnieje inny sposób korzystania z Preprocesorów w szablonach T4, aby wpłynąć na sam szablon, a nie tylko na wynik szablonu?

Odpowiedz

5

W twoim przykładzie dyrektywa preprocesora jest wprowadzana do wygenerowanego wyjścia. To, co możesz potencjalnie zrobić, to mieć plik ProductX.tt, który importuje poprawną przestrzeń nazw i używa < # @ include #>, aby dołączyć kod szablonu.

Coś takiego (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"  #> 

Nie jestem pewien, czy to pomaga, ale szczerze mówiąc jestem trochę walczą bit z tutaj przypadkiem użycia.

+0

Używamy takich szablonów nagłówka, aby to zrobić i stwierdziliśmy, że działa całkiem dobrze. Nie ma sposobu na wstawienie warunków warunkowych wokół dyrektyw wbudowanych w produkt. – GarethJ

+0

Dzięki za odpowiedź. To brzmi jak dobra robota. Kiedy już to zrobię, oznaczę to jako rozwiązanie. –

0

Nowy pomysł na stare pytanie.

Możliwe jest użycie Custom T4 Text Template Directive Processor, aby przejść przez dowolny kod do wyjścia T4.

Niestandardowy procesor dyrektywy musiałby zostać zarejestrowany na każdym komputerze, aby go użyć.

+1

Można napisać niestandardowy procesor dyrektywy, który był w zasadzie niestandardową dyrektywą zawierającą, tak. Jest to dużo pracy w porównaniu do podejścia do szablonu nagłówkowego. – GarethJ

Powiązane problemy