【问题标题】:Inheriting a T4 template from a custom base class, providing Visual Studio 2010 SDK is not installed从自定义基类继承 T4 模板,提供未安装 Visual Studio 2010 SDK
【发布时间】:2011-01-22 06:08:39
【问题描述】:

我有一个 T4 模板系统——在运行时执行,而不是在编译时——它在我的应用程序中生成许多类的骨架。所有这些模板都驻留在生成器工具中,该工具不时用于将新类预生成到目标应用程序中。该工具包含一个配置类,其属性参数化所有 T4 模板的输出。

最初配置类是一个静态类。但是,随着类生成器工具的增长,最好将其设为非静态,而是为每次使用创建一个新实例。问题是如何将此实例传递给 T4 模板的实例。自然的方式似乎是从一个公共基础继承它们,该基础将与配置类实例一起提供。

问题在于 TextTransformation 类,它本来可以由我的自定义 T4 基类继承,它位于一个程序集中,该程序集(根据 this SO question 等来源)不随 Visual Studio 2010 提供。而是它在 Visual Studio 2010 SDK 中提供。

VS2010 生成的基类虽然本身没有祖先,但不是局部的,因此无法通过另一个局部声明“注入”自定义祖先。

因此问题是:有没有一种方法可以从自定义基类继承运行时执行的 T4 模板而无需安装 Visual Studio 2010 SDK?

免责声明:我对 T4 不是很熟悉,所以我可能完全错误地解决了这个问题。因此,欢迎任何其他架构建议,尽管我的目标不是创建一个超级架构的生成器——它只是一个辅助工具,对于偶尔的读者来说应该是简单易懂的。

【问题讨论】:

    标签: visual-studio-2010 inheritance t4


    【解决方案1】:

    解决方案其实很简单——基类可以实现为 T4 模板本身并被继承。像这样:

    基础模板:

    <#@ template language="C#" #>
    <#+ 
    
        public Config Config { get; set; }
    
    #>
    

    继承的模板:

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

    一旦模板被实例化,基本模板中声明的属性就会被提供给实际配置。

    【讨论】:

    • 这很好用,但可能应该指出它只适用于作为基类的预编译模板。
    • @GarethJ 是的,你是对的,我在最初的问题中没有指出这一点——我正在使用预编译的模板。
    • 这是一个绝妙的解决方案!正是我需要的,谢谢!
    • inherits 可以针对任何类,不必是模板(可能仅适用于 Runtime T4)
    【解决方案2】:

    包含基类的程序集确实随 Visual Studio 一起提供,但它安装在 GAC 中,没有参考程序集。 Visual Studio SDK 只包含 DLL 的可引用版本。

    因此,如果您要在代码中创建新的基类,则需要 VS SDK 来构建该基类,但不能使用它。在 rutime 时,会选择 GAC 中的版本。

    【讨论】:

    • 感谢您澄清这方面。我接受你的答案是正确的——但是,就我而言,我提出的使用 T4 基本模板的解决方案更可行。原因是我团队的每个人都在我们的主要解决方案中编译生成器工具,但我不希望仅仅为了偶尔使用的几个 T4 模板而到处安装 VS SDK。
    • 我了解您的用例 - 我们希望在未来的版本中无需进行此类单独安装。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多