我正在使用Visual Studio 2010 TextTemplatingFileGenerator 自定义工具来生成C#代码(.cs),并且想知道是否有一种方法可以防止给定的.tt在给定时完全生成程序化条件。
我想实现以下目标:
在回答之前,请记住不要打算使用 TextTemplatingFilePreprocessor - 我已经探讨了它的优点和缺点。虽然适用于其他场景,但不适合我目前的情况。所以我真的想坚持 TextTemplatingFileGenerator 。
答案 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()
{
#>
}
}
<#+
}
#>
希望它可以帮助别人。干杯!