无法理解T4

时间:2010-08-07 18:34:52

标签: visual-studio visual-studio-2010 t4

我刚开始玩T4,因为我最终想用它来生成映射到LINQ to SQL实体类的POCO,但即使是最简单的例子也让我有些困惑。关于正在发生的事情的一些建议,以及对一些好的阅读的一些建议将不胜感激。

我理解以下模板应该生成一个只包含文本 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类。在我看来,这是一个中间类,应该用于生成实际的预期模板实现,但是应该发生什么呢?

2 个答案:

答案 0 :(得分:3)

ProfK,

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

奥列格

答案 1 :(得分: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 #>

现在,更基本的是