3

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

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

它工作正常。

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

4

3 回答 3

4

您可以使用include 指令来共享另一个文件中的代码。

<#@ include file="Included.tt" #>
于 2013-10-22T16:46:00.090 回答
2

马特的回答是 100% 正确的......但我更喜欢使用“模型”,有时在不同的程序集中,这样我可以使用模板更像是一个没有代码生成逻辑的视图,除了非常简单的循环, (对于,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 #>
于 2013-10-23T05:51:23.997 回答
1

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

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

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

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

于 2013-11-06T22:11:05.363 回答