如何创建封装T4模板文本部分的方法?

时间:2011-01-09 17:37:01

标签: c# visual-studio t4

而不是这个.tt:

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

   <#}
   #>

当然上面的语法不正确。怎么做?

2 个答案:

答案 0 :(得分:7)

这是使用类功能块<#+ ... #>的替代解决方案。 在通常的语句块<# ... #>中使用lambda表达式允许定义本地函数,如下所示:

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

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

<# output(); #>

此模板生成以下输出:

loooooooong text message

答案 1 :(得分:6)

实际上,你与你所拥有的非常接近。 我发现有必要记住模板本质上是一个C#/ VB类,所以当你使用&lt;#+#&gt;时阻止,你真的只是在课堂上添加一个成员。

一旦开始使用&lt;#+#&gt;表示法,你必须继续使用它,因为你仍然在成员级别向类中添加东西,而不是添加常规&lt; ##&gt;的TransformText()方法。标签。

正确的语法是

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

<#+ }
#>