T4:调用写入调用方模板的外部方法
本文关键字:调用 外部 方模板 方法 T4 | 更新日期: 2023-09-27 18:09:15
我正在开发一个基于T4的框架,我想知道是否有一种方法可以调用一个方法(在T$ template的自定义dll引用中定义),该方法可以写入调用方模板调用。
我意识到我可以添加一个标签:<#= CallMethodThatReturnsString #>
到模板并完成它,但是用户倾向于忘记'='符号,所以我想知道是否有一种方法可以使用标准的<# #>指令调用方法并以编程方式写入该位置。
谢谢
有。
从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" #>