2011-01-14 24 views
4

我有一個T4模板系統 - 在運行時執行,而不是在編譯時生成許多類的骨架在我的應用程序。所有這些模板都駐留在生成器工具中,該工具不時用於預先生成新類到目標應用程序中。該工具包含一個配置類,其屬性參數化所有T4模板的輸出。從定製基類繼承T4模板,未提供Visual Studio 2010 SDK

原來配置類是一個靜態類。但是,隨着類生成器工具的增長,最好將其設置爲非靜態,併爲每次使用創建一個新實例。問題是如何將這個實例傳遞給T4模板的實例。自然的方式似乎是從一個共同的基礎繼承它們,它將配置類實例。

問題是TextTransformation類可能會被我的自定義T4基類繼承,它位於一個程序集中(根據來源如this SO question)不隨Visual Studio 2010提供。相反,它提供在Visual Studio 2010 SDK。

由VS2010生成的基類雖然本身沒有祖先,但不是部分的,所以沒有辦法通過另一個部分聲明'注入'自定義祖先。

因此問題是:有沒有辦法從定製基類中繼承運行時執行的T4模板而不需要安裝Visual Studio 2010 SDK?

免責聲明:我對T4並不是很熟悉,所以我可能完全錯在如何解決問題。因此,歡迎任何其他建築方面的建議,儘管我的目標不是創建一個超級架構的生成器 - 它只是一個輔助工具,對偶爾的讀者來說應該是簡單易懂的。

回答

1

包含基類的程序集實際上隨Visual Studio一起提供,但它在沒有引用程序集的GAC中安裝。 Visual Studio SDK只包含可引用版本的DLL。

因此,如果您要在代碼中創建新的基類,則需要VS SDK構建該基類,但不要使用它。屆時,GAC中的版本將被收回。

6

該解決方案其實很簡單 - 基類可以實現爲T4模板本身並繼承。就像這樣:

基本模板:

<#@ template language="C#" #> 
<#+ 

    public Config Config { get; set; } 

#> 

繼承模板:

<#@ template language="C#" inherits="BaseTemplate" #> 
... 
<#= Config.SomeProperty #> 
... 

一旦模板實例在基本模板中聲明的屬性配置的實際配置。

+1

這很好,但可能應該指出,它只適用於預先校準的模板作爲基類。 – GarethJ 2011-01-21 22:09:23

+0

@GarethJ是的,你是對的,我沒有在我的原始問題中指出 - 我正在使用預編譯模板。 – 2011-01-21 22:13:34