我正在開發一個基於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