2015-08-21 70 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" #>