我正在开发一个基于T4的框架,我想知道是否有一种方法可以调用一个方法(在T $模板定义的自定义dll引用中)写入调用者模板调用。T4:调用写入到调用者模板的外部方法
我也知道我可以添加一个标签: <#= CallMethodThatReturnsString#>
为模板,并做到,但是用户往往忘记了“=”号,所以我在想,如果有一个以标准<##>指令调用方法并以编程方式写入该位置。
谢谢
我正在开发一个基于T4的框架,我想知道是否有一种方法可以调用一个方法(在T $模板定义的自定义dll引用中)写入调用者模板调用。T4:调用写入到调用者模板的外部方法
我也知道我可以添加一个标签: <#= CallMethodThatReturnsString#>
为模板,并做到,但是用户往往忘记了“=”号,所以我在想,如果有一个以标准<##>指令调用方法并以编程方式写入该位置。
谢谢
是的,有。
默认情况下,从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" #>
我有点不清楚 - 你是否试图以编程方式更改您的T4模板?你能提供更多的上下文给你提供的例子:'<#= CallMethodThatReturnsString#>'显示你想要做什么?我知道你不想使用这种方法,但它可能有助于证明你正在努力完成的事情。 – David