2011-01-09 80 views
5

代替此.TT的:如何創建封裝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#> 

我想有一個輸出功能,將返回輸出等等等等等等:

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

    <#} 
    #> 

當然上面的語法不正確。這個怎麼做 ?

回答

6

其實你已經非常接近你在那裏。 我發現它有助於記住模板本質上是一個C#/ VB類,所以當你使用一個<#+#>塊時,你實際上只是將一個成員添加到類中。一旦開始使用<#+#>表示法,您必須繼續使用它,因爲您仍然在成員級別向類中添加東西,而不是添加常規的TransformText()方法#<##>標籤。

正確的語法將是

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

<#+ } 
#> 
6

這是使用類特徵塊<#+ ... #>的替代解決方案。 使用平常語句塊<# ... #>內部lambda表達式允許定義一個局部函數如下:

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

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

<# output(); #> 

該模板產生以下輸出:

loooooooong text message