我有以下T4文本模板,并在很多地方重复:
<# if (!package.Name.Equals("Amazon")) {#>
<td><#=package.Name#></td>
<#} else {#>
<td><a href="<#=package.Name#>@Amazon.com"><#=package.Name#></a></td>
<#}#>
我想用一个函数替换它,如果package.Name等于Amazon,则返回带有href属性的字符串,例如:
private static string ConvertPackageName(Package package)
{
if (!package.Name.Equals("Amazon"))
{
return package.Name;
}
return "<a href="<#=package.Name#>@Amazon.com"><#=package.Name#></a>";
}
是否有可能有这样的东西,所以我可以得到这样的代码:
<td><#=ConvertPackageName(package)#></td>
答案 0 :(得分:1)
您需要使用class feature blocks:<#+ /* code */ #>
答案 1 :(得分:1)
正如Athari所说,你需要使用class feature blocks。有一些问题你需要了解才能使它们运作良好。
必须将要素块中的所有语句块(<# #>
)更改为要素块。这意味着您通常会使用<# #>
标记,现在使用<#+ #>
标记。 <#= #>
代码仍可正常使用。
在第一个功能块之后,您不能拥有任何语句块。因此,您需要将函数放在模板文件的末尾。
以下是代码外观的示例:
Some template code....
<# ConvertPackageName(package); #>
More template code...
<# ConvertPackageName(package); #>
....
<#+ void ConvertPackageName(Package package) { #>
<#+ if (!package.Name.Equals("Amazon")) {#>
<td><#=package.Name#></td>
<#+} else {#>
<td><a href="<#=package.Name#>@Amazon.com"><#=package.Name#></a></td>
<#+}#>
<#+}#>
END OF TEMPLATE
在ConvertPackageName中生成的文本将在您调用方法的任何地方注入,因此在您的示例中,您将拥有类似于<td><# ConvertPackageName(package); #></td>
的模板代码