T4:调用写入调用者模板的外部方法

时间:2015-08-21 20:22:00

标签: c# .net t4

我正在开发一个基于T4的框架,我想知道是否有办法调用写入调用者模板调用的方法(在T $模板的自定义dll引用中定义)。

我意识到我可以添加标签: <#= CallMethodThatReturnsString#>

到模板并完成,但用户往往会忘记'='符号,所以我想知道是否有办法用标准< ##>调用方法指令并以编程方式写入该位置。

由于

1 个答案:

答案 0 :(得分:0)

是的,有。

默认情况下,从T4模板生成的代码继承自Microsoft.VisualStudio.TextTemplating.TextTransformation。这个类有一个Write方法,这意味着这两个指令是等价的:

<#= Guid.NewGuid() #>
<# Write("{0}", Guid.NewGuid()); #>

您需要获得this的引用才能致电Write。您可以对lib执行一些初始化,例如:

<# MyLib.Initialize(this); #>

然后将其存储在static ThreadLocal<TextTransformation>字段中。

但我发现这种方法存在一些问题:

  • 如果您的用户忘记拨打Ìnitialize
  • ,显然无法工作
  • 如果您的lib用户想要使用继承自TextTransformation的自定义模板基类,它将无法工作。您必须使用dynamic来规避
  • 现在,=已不再需要了,但您刚刚交换了强制性;的结果;)

话虽这么说,我不建议你这样做 - 只是不要打扰并继续要求标准<#= #>

...或者,如果可行,您可以为模板编写自己的自定义基类并在其中实现lib。只需展开TextTransformation并使用<#@ template language="C#" inherits="MyLib" #>

即可