Templates T4模板在其他T4模板中的重用方法

Templates T4模板在其他T4模板中的重用方法,templates,t4,Templates,T4,在T4模板文件的末尾,我定义了一些函数: <#+ type Foo(...) { ... } type Bar(...) { ... } ... #> 它很好用 现在我正在创建另一个模板。是否有任何方法可以使用我的第一个模板文件中声明的函数(可能使用第三个文件来存储这些函数)?您可以使用共享另一个文件中的代码 <#@ include file="Included.tt" #> 马特的答案100%正确。。。但我更喜欢使用“

在T4模板文件的末尾,我定义了一些函数:

<#+
    type Foo(...) { ... }
    type Bar(...) { ... }
    ...
#>

它很好用

现在我正在创建另一个模板。是否有任何方法可以使用我的第一个模板文件中声明的函数(可能使用第三个文件来存储这些函数)?

您可以使用共享另一个文件中的代码

<#@ include file="Included.tt" #>

马特的答案100%正确。。。但我更喜欢使用“模型”,有时在不同的程序集中,这样我可以使用模板,更像一个没有代码生成逻辑的视图,除了非常简单的循环(例如,foreach…等等)。我觉得以后读起来更容易。维护、重用和故障排除。由于该模型是用普通的c#编写的,因此过于简单,并且没有经过测试

 <#@ output extension=".generated.cs" #>
 <#@ assembly name="$(SolutionDir)Bin\Net45\GeneratorModel.dll" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ import namespace="GeneratorModel" #>
 <#@ import namespace="Extensions" #>
 <# IEnumerable<Type> entities = GetCollection();
    const string nameSpace = GetNameSpace();
  #> //Autogenerated Stuff
  using System;
  using System.Collections.Generic;
  namespace <#=nameSpace#> 
  {
    public interface IEntity{}

    <# foreach (var entity in entities){#>  

    #region class

    public partial class <#=entity.Name#> : IEntity {
        <#foreach(var prop in entity.GetPublicProperties()){#>
          /* More stuff Here .. */              
        <#}#>
    }

    #endregion class    
    <#}#>                                       
   }<#// End OF NameSpace #>

//自动生成的东西
使用制度;
使用System.Collections.Generic;
名称空间
{
公共接口属性{}
#区域类
公共部分类:独立性{
/*这里有更多东西..*/
}
#端域类
}

第一个问题:您使用的是2012年还是2010年?2010年存在一个问题,即T4没有包含保护。这意味着,如果您创建了一个可重用的T4帮助器方法文件,那么您必须小心反复包含该文件,并在引用相同的文件时出错。在一般情况下,T4可以实现这一点,但如果您开始使用Sych的T4Toolbox或其他工具在T4中构建大型构造,则会遇到问题

<#@ include file="MyTools.Include.tt" #>

此外,您应该考虑您确实有两种类型的模板——“根”模板,它们是直接生成的,以及“支持”模板,这些模板是要包括在内的——很好地提出了一种区分这些的方法——我使用了“.Copy.TT”文件名,但是其他人将有自己的方法。您还需要从include文件中清除“Custom Tool”属性,这样您就可以自由地使用“Transform All”命令,而不会在垃圾模板上浪费时间


在极端情况下,您可以编译自己的程序集供T4使用。这允许您快速转换,而不是等待动态编译可重用的东西。。。但这也有其自身的问题。

我认为这是一个品味问题;对于可维护性和可重用性,我更倾向于尽可能多地保留在T4土地上,并尽可能少地依赖组件,因为我发现这些组件很难重新分发和修改。我不是想说服任何人改变主意,只是指出在这个问题上有不同的观点;演示解决问题的不同方法是很好的