我有一个T4模板系统 - 在运行时执行,而不是在编译时 - 它会在我的应用程序中生成许多类的骨架。所有这些模板都驻留在生成器工具中,该工具不时用于将新类预生成到目标应用程序中。该工具包含一个配置类,其属性参数化所有T4模板的输出。
最初配置类是静态类。但是,随着类生成器工具的增长,最好使其成为非静态的,而是为每次使用创建一个新实例。问题是如何将此实例传递给T4模板的实例。自然的方式似乎是从一个公共基础继承它们,这个公共基础将配置配置类实例。
问题是我的自定义T4基类继承的TextTransformation
类位于一个程序集中(根据像this SO question这样的来源)不附带Visual Studio 2010.相反,它是在Visual Studio 2010 SDK中提供的。
VS2010生成的基类虽然本身没有祖先,但不是部分的,所以没有办法通过另一个部分声明“注入”自定义祖先。
因此问题是:有没有办法从自定义基类继承运行时执行的T4模板而无需安装Visual Studio 2010 SDK?
免责声明:我对T4不是很熟悉,所以对于如何解决问题我可能完全错了。因此,欢迎任何其他建筑建议,虽然我的目标不是创建一个超级架构的发电机 - 它只是一个帮助工具,对于偶尔的读者来说应该是简单易懂的。
答案 0 :(得分:6)
解决方案实际上非常简单 - 基类可以作为T4模板本身实现并继承。像这样:
基本模板:
<#@ template language="C#" #>
<#+
public Config Config { get; set; }
#>
继承模板:
<#@ template language="C#" inherits="BaseTemplate" #>
...
<#= Config.SomeProperty #>
...
实例化模板后,基本模板中声明的属性将提供给实际配置。
答案 1 :(得分:1)
包含基类的程序集确实随Visual Studio一起提供,但它安装在GAC中,没有引用程序集。 Visual Studio SDK只包含DLL的可引用版本。
因此,如果您在代码中创建新的基类,则需要VS SDK来构建该基类,而不是使用它。在rutime,将收集GAC中的版本。