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

本文关键字:调用 外部 方模板 方法 T4 | 更新日期: 2023-09-27 18:09:15

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

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

到模板并完成它,但是用户倾向于忘记'='符号,所以我想知道是否有一种方法可以使用标准的<# #>指令调用方法并以编程方式写入该位置。

谢谢

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

有。

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

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

为了能够调用Write,您需要获得对this的引用。您可以强制对库进行一些初始化,例如:

<# MyLib.Initialize(this); #>

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

但是我发现这种方法有一些问题:

  • 如果你的lib用户忘记调用Ìnitialize,它显然不会工作
  • 如果你的lib用户想要使用一个自定义模板基类,而没有从TextTransformation继承,那么它将不起作用。你必须使用dynamic来绕过
  • 现在,=不再是必需的,但你只是在最后交换了一个强制性的;;)

话虽如此,我不建议你这样做——只是不要麻烦,继续要求标准的<#= #>

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