2011-09-21 11 views
5

Tengo una plantilla T4 que se usa con TextTemplatingFilePreprocessor para generar una clase que luego puedo usar para generar el resultado de la plantilla.Se pueden usar símbolos de compilación condicional dentro de plantillas T4

Al comienzo de la plantilla T4 importo varios espacios de nombres. P.ej.

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

Me gustaría utilizar Preprocessor Directives para cambiar a cabo estas importaciones con otro conjunto de espacios de nombres (que proporcionan las mismas interfaces, pero que difieren funcionalidad a ProductX). P.ej.

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

Con el ejemplo anterior las importaciones parecen crear las correspondientes mediante instrucciones en la clase, independientemente de la directiva de preprocesador. P.ej.

using Company.ProductX.Widgets 
using Company.ProductX.Services 
using Company.ProductY.Widgets 
using Company.ProductY.Services 

¿Hay otra manera de utilizar Preprocesadores en las plantillas T4 para afectar a la propia plantilla en lugar de sólo la salida de la plantilla?

Respuesta

5

En su ejemplo, la directiva de preprocesador se inyecta en la salida generada. Lo que potencialmente podría hacer es tener un archivo ProductX.tt que importe el espacio de nombres correcto y use < # @ include #> para incluir el código de la plantilla.

Algo como esto (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"  #> 

No estoy seguro de si esto te ayuda, pero para ser honesto, estoy luchando un poco poco con el caso de uso aquí.

+0

Usamos tales plantillas de "encabezado" para hacer esto y encontramos que funciona bastante bien. No hay forma de insertar condicionales en torno a las directivas integradas en el producto. – GarethJ

+0

Gracias por la respuesta. Esto suena como un buen trabajo. Una vez que lo tenga funcionando, lo marcaré como la solución. –

0

Nueva idea para una vieja pregunta.

Es posible utilizar un Custom T4 Text Template Directive Processor para pasar el código arbitrario a la salida T4.

El procesador de directivas personalizado debería estar registrado en cada máquina para usarlo.

+1

Puede escribir un procesador de directivas personalizado que sea esencialmente una directiva de inclusión personalizada, sí. Sin embargo, es mucho trabajo comparado con el enfoque de plantilla de encabezado. – GarethJ

Cuestiones relacionadas