我正在开发一个基于T4的框架,我想知道是否有办法调用写入调用者模板调用的方法(在T $模板的自定义dll引用中定义)。
我意识到我可以添加标签: <#= CallMethodThatReturnsString#>
到模板并完成,但用户往往会忘记'='符号,所以我想知道是否有办法用标准< ##>调用方法指令并以编程方式写入该位置。
由于
答案 0 :(得分:0)
是的,有。
默认情况下,从T4模板生成的代码继承自Microsoft.VisualStudio.TextTemplating.TextTransformation
。这个类有一个Write
方法,这意味着这两个指令是等价的:
<#= Guid.NewGuid() #>
<# Write("{0}", Guid.NewGuid()); #>
您需要获得this
的引用才能致电Write
。您可以对lib执行一些初始化,例如:
<# MyLib.Initialize(this); #>
然后将其存储在static ThreadLocal<TextTransformation>
字段中。
但我发现这种方法存在一些问题:
Ìnitialize
TextTransformation
的自定义模板基类,它将无法工作。您必须使用dynamic
来规避=
已不再需要了,但您刚刚交换了强制性;
的结果;)话虽这么说,我不建议你这样做 - 只是不要打扰并继续要求标准<#= #>
。
...或者,如果可行,您可以为模板编写自己的自定义基类并在其中实现lib。只需展开TextTransformation
并使用<#@ template language="C#" inherits="MyLib" #>