2015-08-21 102 views
0

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

我也知道我可以添加一个标签: <#= CallMethodThatReturnsString#>

为模板,并做到,但是用户往往忘记了“=”号,所以我在想,如果有一个以标准<##>指令调用方法并以编程方式写入该位置。

谢谢

+0

我有点不清楚 - 你是否试图以编程方式更改您的T4模板?你能提供更多的上下文给你提供的例子:'<#= CallMethodThatReturnsString#>'显示你想要做什么?我知道你不想使用这种方法,但它可能有助于证明你正在努力完成的事情。 – David

回答

0

是的,有。

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

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

你需要得到一个参考this为了能够调用Write。你可以做一些初始化的强制性您的lib,比如:

<# MyLib.Initialize(this); #> 

,然后存储这在static ThreadLocal<TextTransformation>场。

但我看到一些问题,这种方法:

  • 它,如果你的LIB忘记的用户呼叫Ìnitialize
  • 显然是行不通的,如果你的LIB的用户希望它不会工作使用不会继承自TextTransformation的自定义模板基类。你不得不使用dynamic来规避
  • 现在,=不是必需的了,但你只是交易,对于在年底强制性;;)

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

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