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

时间:2013-10-22 14:14:12

标签: templates t4

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

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

工作正常。

现在我正在创建其他模板。有没有办法使用我的第一个模板文件中声明的函数(可能通过使用第三个文件来存储这些函数)?

3 个答案:

答案 0 :(得分:3)

您可以使用include directive分享另一个文件中的代码。

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

答案 1 :(得分:1)

Matt的回答是100%正确...但我更喜欢使用“模型”,有时使用不同的程序集,这样我就可以使用模板更像一个没有代码生成逻辑的视图,除了非常简单的循环,(for,foreachs ......等)。我后来认为更容易阅读。维护,重用和排除故障。由于模型是用简单的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 #>

答案 2 :(得分:1)

第一个问题:您使用的是2012年还是2010年? 2010年有一个问题是T4没有包含警戒。这意味着如果你制作一个可重用的T4 helper-methods文件,你必须要小心一遍又一遍地包含它并从引用相同的文件中获得错误。在琐碎的情况下,T4对此很好,但是如果你使用Sych的T4Toolbox或其他东西开始在T4中构建大型构造,你会遇到问题。

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

此外,您应该考虑到您确实有两种类型的模板 - 旨在直接生成的“根”模板,以及旨在包含的“支持”模板 - 最好提出一个约定区分这些 - 我使用“.Include.tt”文件名,但其他人将有自己的方法。您还需要清除包含文件中的“自定义工具”属性,以便您可以自由使用“全部转换”命令,而不会浪费时间在垃圾模板上。

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