如何防止在编程条件下生成T4(.tt)模板

时间:2012-08-10 13:32:53

标签: c# templates code-generation conditional t4

我正在使用Visual Studio 2010 TextTemplatingFileGenerator 自定义工具来生成C#代码(.cs),并且想知道是否有一种方法可以防止给定的.tt在给定时完全生成程序化条件。

我想实现以下目标:

  • 有时我想生成一个常规的可编辑类;
  • 其他时候我想生成一对代表父子关系的类,每个类都实现其角色所需的特定规则集。

在回答之前,请记住不要打算使用 TextTemplatingFilePreprocessor - 我已经探讨了它的优点和缺点。虽然适用于其他场景,但不适合我目前的情况。所以我真的想坚持 TextTemplatingFileGenerator

3 个答案:

答案 0 :(得分:1)

我不是百分之百场景,但这听起来像你想要的是生成代码,允许你编辑部分生成的代码,并在重新生成时保留你的更改。如果这不是你想要的,你可以忽略这篇文章(但请在这种情况下提供更多解释你的情景)。

以上情况是T4中不可能的AFAIK。但是,如果要生成C#代码,则可以使用partial关键字来实现代码的某些部分生成,而其他部分则是手写的。

假设你生成了A类。然后T4模板应该将partial属性应用于生成的类。

// This class is auto-generated
partial class A 
{ 
     int X; 
}

这将允许您使用您手动维护的另一个文件中的新成员扩展生成的类。

// This class is manually written
partial class A 
{
    int Y; 
}

最终的A类将包含字段X和Y。

您还可以使用部分方法

更改A类的行为

希望这有帮助

答案 1 :(得分:1)

如果您可以使用为A,B,C(或者总是生成最小存根的一个'控制'文件)生成的最小存根文件,那么您可以使用类似Damien Guard的T4直接执行此操作多文件输出技术。

http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited

这可以通过您的模板以编程方式进行控制。

答案 2 :(得分:0)

经过大量的挖掘,我意识到解决方案一直都在我的眼前。我只需要一个多部分类,其组成是动态的。有时,结果基于一个子集,另一次基于另一个子集。

所以,这就是

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#

    var IsParent = true; // setting to false prevents Parent code from being generated
    var IsChild = true; // setting to false prevents Child code from being generated

    GenHeader();

    if (IsParent)
        GenParentProperties();

    if (IsChild)
        GenChildProperties();

    GenFooter();

#>

<#+
    void GenHeader()
    {
#>
// Code generated by a template

using System;

namespace StackOverflow
{
    public class Person
    {
        string Name;
        int Age;
<#+
    }
#>


<#+
    void GenParentProperties()
    {
#>
        Person[] Childs;
<#+
    }
#>

<#+
    void GenChildProperties()
    {
#>
        Person Father;
        Person Mother;
<#+
    }
#>

<#+
    void GenFooter()
    {
#>
    }
}
<#+
    }
#>

希望它可以帮助别人。干杯!