2011-01-09 7 views
5

Zamiast tego .tt:Jak utworzyć metodę enkapsulującą sekcję tekstu szablonu 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#> 

Chciałbym mieć funkcję wyjściową że zwróciłby bla bla itd .: wyjście

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

    <#} 
    #> 

Oczywiście składnia powyżej nie jest poprawne. Jak to zrobić ?

Odpowiedz

6

W rzeczywistości jesteś bardzo blisko tego, co tam masz. Uważam, że pomaga pamiętać, że szablon jest w zasadzie klasą C#/VB pod maską, więc kiedy używasz bloku < # + #>, naprawdę dodajesz członka do klasy.

Po rozpoczęciu korzystania z notacji < # + #> należy nadal jej używać, ponieważ nadal dodajesz elementy do klasy na poziomie członków, nie dodając metody TransformText(), która jest zwykła. < # #> znaczniki do.

Poprawna składnia byłoby

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

<#+ } 
#> 
6

To alternatywne rozwiązanie nie użyciu bloków funkcji klasa <#+ ... #>. Używanie wyrażenia lambda wewnątrz zwykłych bloków rachunku <# ... #> umożliwia definiowanie lokalną funkcję w następujący sposób:

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

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

<# output(); #> 

Ten szablon tworzy poniższy wynik:

loooooooong text message