0

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

我想实现以下目标:

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

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

4

3 回答 3

1

我不是 100% 的场景是什么,但听起来你想要的是生成代码,允许你编辑生成的代码的一部分,并在重新生成时保留你的更改。如果这不是您要查找的内容,则可以忽略此帖子(但请在这种情况下对您的情况提供更多解释)。

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

假设您生成类 A。然后 T4 模板应将部分属性应用于生成的类。

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

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

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

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

您还可以使用部分方法更改 A 类的行为

希望这可以帮助

于 2012-08-10T13:49:20.427 回答
1

如果您可以忍受为所有 A、B、C 生成的最小存根文件(或者一个始终生成最小存根的“控制”文件),那么您可以使用诸如 Damien Guard 的多文件输出之类的东西直接使用 T4 执行此操作技术。

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

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

于 2012-08-10T19:49:07.703 回答
1

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

所以,这里是

<#@ 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()
    {
#>
    }
}
<#+
    }
#>

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

于 2012-08-12T03:05:56.137 回答