2011-01-09 9 views
5

En lugar de esto .tt:¿Cómo crear un método que encapsule la sección de texto de la plantilla T4?

<#@ template debug="false" hostspecific="true" language="C#" #> 
<#@ import namespace="System.IO" #> 
<#@ output extension=".txt" #> 
<#@ assembly name="System"#> 

<# message = "hello world" ; #> 

blah blah blah etc. very complex example with embedded expression like 
<#=message#> 

Me gustaría tener una función de salida que devolvería el bla, bla, etc .: salida

<#@ template debug="false" hostspecific="true" language="C#" #> 
    <#@ import namespace="System.IO" #> 
    <#@ output extension=".txt" #> 
    <#@ assembly name="System"#> 

    <#output();#> 

    <#+ output() { #> 
    blah blah blah etc. very complex example with embedded expression like 
    <#=message#> 

    <#} 
    #> 

Por supuesto, la sintaxis anterior no es correcta. Como hacer esto ?

Respuesta

6

En realidad, estás muy cerca de lo que tienes allí. Me parece útil recordar que la plantilla es esencialmente una clase C#/VB bajo el capó, por lo que cuando usa un bloque < # + #>, realmente solo está agregando un miembro a la clase.

Una vez que haya comenzado a utilizar la notación < # + #, debe seguir usándola, ya que todavía está agregando cosas a la clase a nivel de miembro, sin agregar el método TransformText() que regularmente < # #> las etiquetas sí.

La sintaxis correcta sería

<#+ public void output() { #> 
blah blah blah etc. very complex example with embedded expression like  <#=message#> 

<#+ } 
#> 
6

Esta es una solución alternativa no utilizando bloques de función de clase <#+ ... #>. Usando una expresión lambda dentro de bloques de instrucciones habituales <# ... #> permite la definición de una función local como sigue:

<#@ template language="C#" #> 
<#@ output extension=".txt" #> 

<# Action output =() => { #> 
loooooooong text <#= "message" #> 
<# }; #> 

<# output(); #> 

Esta plantilla produce la salida a continuación:

loooooooong text message 
Cuestiones relacionadas