2011-01-09 12 views
5

Invece di questo .tt:Come creare un metodo che incapsula la sezione di testo del modello 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#> 

Mi piacerebbe avere una funzione di uscita che sarebbe tornato il bla bla di uscita ecc .:

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

    <#} 
    #> 

Naturalmente la sintassi di cui sopra non è corretto. Come fare questo ?

risposta

6

In realtà sei molto vicino a quello che hai lì. Trovo utile ricordare che il modello è essenzialmente una classe C#/VB sotto il cofano, quindi quando si utilizza un blocco < # + #>, si aggiunge semplicemente un membro alla classe.

Una volta che hai iniziato a usare la notazione < # + #, devi continuare ad usarlo, dato che stai ancora aggiungendo roba alla classe a livello di membro, non aggiungendo il metodo TransformText() quale normale < # #> tag fare.

La sintassi corretta sarebbe

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

<#+ } 
#> 
6

Questa è una soluzione alternativa non utilizzando includono classe blocchi <#+ ... #>. Usando un'espressione lambda all'interno usuali blocchi di istruzioni <# ... #> permette di definire una funzione locale come segue:

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

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

<# output(); #> 

Questo modello produce l'output di seguito:

loooooooong text message 
Problemi correlati