【问题标题】:Inheritance in T4 templateT4 模板中的继承
【发布时间】:2021-11-23 17:27:26
【问题描述】:

我有两个 .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:\Users\xxx\source\repos\Template\Template\Template2.tt 1

有什么我错的建议或如何删除重复项?

【问题讨论】:

    标签: c# inheritance t4


    【解决方案1】:

    您应该查看.ttinclude 文件,而不是使用继承,正如Guidelines for All T4 Templates 中解释的那样(实际上解释得不是很好……只是提到)。您的.tt 文件成为主要编排,您调用包含文件中定义的方法。

    继承可以工作,但长期管理会变得困难,您会发现使用 include 文件可以让您更加灵活,通过在不同的文件中保留常用的有用例程集,而不是时间您将能够在更多样化的场景中使用这些文件。将.ttinclude 想象成Header Files in 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();
    
    
    #>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多