2010-08-07 161 views
2

我刚刚开始玩T4,因为我最终希望使用它来生成映射到LINQ to SQL实体类的POCO,但即使是最简单的示例也让我略感困惑。有关发生什么的一些建议,以及一些良好的阅读建议,将不胜感激。疑难解答T4

我的理解是,下面的模板应该产生一个只包含文本的文件Hello World!,但它生成一个输出文本Hello World的类!我如何得到我的简单和简单Hello World只有文件?

模板:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
class HelloWorld 
{ 

} 

输出:

#line 1 "C:\Development\PocoGenerator\PocoGenerator\HelloWorld.tt" 
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "10.0.0.0")] 
public partial class HelloWorld : HelloWorldBase 
{ 
    public virtual string TransformText() 
    { 
     this.GenerationEnvironment = null; 
     this.Write("class HelloWorld\r\n{\r\n\r\n}\r\n\r\n"); 
     return this.GenerationEnvironment.ToString(); 
    } 
} 

#line default 
#line hidden 

这之后是在同一个输出文件中的相对复杂HelloWorldBase类。在我看来,这是一个应该用于生成实际预期的模板实现的中间类,但是应该怎么做才会发生?

回答

3

ProfK,

您正在寻找由preprocessed template产生的结果。如果您在Visual Studio的新项目项目对话框中选择常规“文本模板”,您将看到完整的转换结果。

奥列格

+1

你先生,是明星! – ProfK 2010-08-08 17:23:21

1

从未见过......你的情况输出应该仅仅是:

class HelloWorld 
{ 
} 

刚刚进行了测试,这就是它产生在这里...

什么是自定义工具为你的.tt文件?您可以通过右键单击解决方案资源管理器中的文件并选择“属性”来检查。它应该是'TextTemplatingFileGenerator'。

在T4中,<##>之间的所有内容都被解释为代码(本例中为C#)。与ASP.Net的<%=<%:类似,您也可以使用'<#='将语句自动转换为字符串。因此,为了简单地输出的 'Hello World' 您可以使用文字文本:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
Hello World 

或使用本:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
<#= "Hello World" #> 

甚至另一种方式:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
<# var text = "Hello World"; #> 
<#= text #> 

现在,更根本地

+0

谢谢。出于某种原因,自定义工具是“TextTemplatingFilePreprocessor”。我更改为 - 发电机,并按预期工作。 – ProfK 2010-08-08 09:18:50