T4模板的继承



我有两个.tt文件(template1。tt和Template2.tt),其中有部分代码是相同的。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
<#
Assembly assem1 = Assembly.LoadFrom("a.dll");
Assembly assem2 = Assembly.LoadFrom("b.dll");
#>

以上是<#…#>

中的常用代码所以我想从T4模板中删除公共部分。我尝试使用创建一个基本模板(Template3)。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>
<#+ 
public void loadAssemblies()
{
Assembly assem1 = Assembly.LoadFrom("a.dll");
Assembly assem2 = Assembly.LoadFrom("b.dll");
}
#>

现在当我试图添加

<#@ template debug="false" hostspecific="false" language="C#" inherits="Template3" #>

tt文件未编译

错误是

项目文件行抑制状态编译转换错误:无法找到类型或名称空间名称"Template3"(您是否缺少using指令或程序集引用?)模板C:UsersxxxsourcereposTemplateTemplateTemplate2.tt 1

有什么建议我错了,或者我如何删除重复?

不要使用继承,您应该像解释的那样查看.ttinclude文件(实际上解释得不是很好……在所有T4模板指南中(仅暗示)。您的.tt文件成为主要的业务流程,您可以调用在包含的文件中定义的方法。

继承可以工作,但是它变得难以长期管理,您会发现使用include文件允许您更加灵活,通过在不同的文件中保留通用的有用例程集,随着时间的推移,您将能够在更多样化的场景中使用这些文件。把.ttinclude看作是C中的头文件,它将其他文件与当前文件内联。

common.ttinclude

<#@ CleanupBehavior Processor="T4VSHost" CleanupAfterProcessingTemplate="true" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#+ 
public static Assembly assem1 = null;
public static Assembly assem2 = null;
public static void loadAssemblies()
{
assem1 = Assembly.LoadFrom("a.dll");
assem2 = Assembly.LoadFrom("b.dll");
}
#>

模板
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ include file="common.ttinclude"#>
<#@ output extension=".cs" #>
<#
loadAssemblies();

#>

最新更新