zoukankan      html  css  js  c++  java
  • T4系列文章之1:认识T4

    不知道园子里有多少人对T4 模板语言熟悉?我猜想应该没有多少,因为在我身边,我问了好几个人,都说木有听过,听到这个心理挖凉哇凉的。 不过,也难怪,就拿我来说,我也是最近才刚刚接触T4的,所以对它的认识也只是一些表面上的认知吧。自不量力的想写这一系列的文章。

    其实,我的原先的目的是因为我在做扩展UML的时候(因为我自己在弄通过UML的类图自动生成实体类型、方法和属性等等),它那里需要用到T4语言来进行写模板。所以,就抽了个时间把这些知识比较系统的看了看。

    声明一下:本次系列的文章根据MSDN 的 T4介绍、Oleg Sych大师的文章以及自己的一些实战经验或者说自己的感悟吧。

    写的不好之处,尽请谅解。有问题,多拍砖,多讨论。

    一、导读

    MSDN:Code Generation and T4 Text Templates

    博客园:编写T4模板进行代码生成

    Oleg Sych系列文章:http://www.olegsych.com/2007/12/text-template-transformation-toolkit/

    我先前写的有关T4在MVC 里的运用 :MVC T4 扫盲贴

    二、有关T4的简介

    我和我的同事讨论这个问题的时候,刚开始很多人不懂T4是什么玩意,其实T4语言,它指的是4个t开头的英文字母---Text Template Transformation Tookit ,即 文本模板转换工具。  

    T4 模板语言是一个模板代码生成语言,什么意思呢?就是通过模板,生成我们相应的所需要的文件。很好理解,比如我们在写类的时候,我们通常是新建一个类文件,这个时候它出来的页面并非空白,而是有一些基本的内容,比如我新建一个 MyTest的类文件:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace BLL
    {
        class MyTest
        {
        }
    }
    

      

    所以,上面的这些常用的信息就是用模板语言来进行新建的。

    T4 模板语言的后缀以.tt结尾的,我们可以在 VS 2008 或 VS 2010里面进行使用。如下图:

    看到了木有,第一个“预处理的文本模板”和第二个是文本模板。

    介绍2中模板的用途:

    One .预处理的文本模板

    先说说这个,这个是设计时的模板。可以在运行时在应用程序中生成文本字符串 预处理过的模板有时称为运行时文本模板。什么是运行时模板呢?其实,也很好理解,比如我们在写C#代码的时候,我们也分为运行时的编译还是设计时,运行时就是在程序开始执行的时候才开始,而设计时是说你在写代码那一刻就开始编译。更具体的例子说,假如我们有一个错误,如果编译时错误,那么我们写完离开就会显示出来,可是有些错误在编译的时候,是无法知道的,比如说内存泄露等等,这个必须要等程序运行的时候才能知道。

    一般来说,预处理模板在项目中的使用比较大,因为它有一个partial的分部类,我们都知道,在VS里面为了便于对某些元素进行扩展,很多时候都使用的分部类。这里也不例外。而且我目前做的通过UML 类图生成代码 都是通过partial来进行扩展的。

    我们可以看到,它和文本模板(第二点会介绍)属性的唯一不同便是:自定义工具的值不同。预处理的是:TextTemplatingFilePreprocessor

    文本的是:TextTemplatingFileGenerator

    现在先建立预处理的文件,对于它的一些语法,我们暂时先不考虑,语法我们会在下一节进行说明。

    将创建一个扩展名为 .tt 的新文件。该文件的“自定义工具”属性设置为 TextTemplatingFilePreprocessor。如下图:

    具体操作过程如下:

    1.在解决方案资源管理器中,右击项目,指向“添加”,再单击“新建项”。

    2.在“添加新项”对话框中,选择“预处理文本模板”。(在 Visual Basic 中的“常用项\常规”下查看。)

    3.键入模板文件的名称。

    这里需要注意的一点是,模板文件名将在生成的代码中用作类名。因此,该名称不应包含空格或标点。

    4.单击“添加”。可以了,到这一步就OK了。

    然后会看到只有一行代码:<#@ template language="C#" #>

    现在我们,在这行代码的下面放入以下代码:

    <#@ output extension=".html" #>
    <h1>列出所有数字:</h2>
    <table>
        <# for (int i = 1; i <= 10; i++)
           {
    		#>
             <tr><td>数字: <#= i #> </td>
                 <td>倍数: <#= i * i #> </td> </tr>
        <# } #>
     </table>
    

      

    我们现在只需要知道的是,它输出的类型是.html,extension=".html",即表明它输出的是网页文件。

    那我们怎么看它呢?

    比如我们需要在aspx里调用这个模板文件,那么我只需要在需要触发事件的方法下面调用这个就OK,比如我这里是在page_load的时候,把模板里的内容显示到页面上。

    protected void Page_Load(object sender, EventArgs e)
            {
                PreTextTemplate1 t4 = new PreTextTemplate1();
                string str = t4.TransformText();
                t4Div.InnerHtml = str;
            }
    

    页面,我放了一个div,如<div id="t4Div" runat="server"></div>,把runat设为server是为了在后台能调用,当然你也可以用其他空间进行渲染。

    你还可以在控制台进行显示,调用方法也和上面一样。比如在控制台输出的内容为:

    很酷吧。暂时先体验一下吧。

    好了,接下来我们来说说文本模板。

    Two.文本模板

    如上图所示,文本模板里的自定义工具是:TextTemplatingFileGenerator

    文本模板是一种在设计时显示的结果的一种模式.也就是所见所得的一种模式吧。

    1.生成html文件

    比如我现在还是上面的代码,新建一个文本模板,然后再下面写入一下代码:

    <#@ template debug="false" hostspecific="false" language="C#" #>

    <#@ output extension=".html" #>

    <html><body>

    <h1>Sales for Previous Month</h2>

    <table>

        <# for (int i = 1; i <= 10; i++)

           { #>

             <tr><td>Test name <#= i #> </td>

                 <td>Test value <#= i * i #> </td> </tr>

        <# } #>

     </table>

    This report is Company Confidential.

    </body></html>

    这个 结果怎么看呢?很简单,你只需要展开TextTemplate1.tt,你会看到一个TextTemplate1.html(因为你上面的output设置了.html)文件。

    2.生成文本文件

    <#@ output extension=".txt" #>

    列出数字从1 到 10:

    <#

           int list=10;

           for(int i=0;i<10;i++){

    #><#= i #><#= } #>

    它和上面的唯一的区别就是output的不一样。查看方式也很easy哦。

    3. 生成类文件

    你还可以生成类文件,它主要的都合上面的一样,唯一的区别就是output的输出类型是.cs文件。

    <#@ output extension=".cs" #>

    <# var properties = new string [] {"P1", "P2", "P3"}; #>

    class MyGeneratedClass {

    <#

      foreach (string propertyName in properties)

      { #>

      private int <#= propertyName #> = 0;

    <# } #>

    }

    生成

    class MyGeneratedClass {

      private int P1 = 0;

      private int P2 = 0;

      private int P3 = 0;

    }

    呵呵 我们这里模拟了类文件的生成,你此刻想到什么了?

    三 总结

    OK,T4的基本介绍就先到这里。可能在这里你有好些地方,比如说T4的语法等等,木有关系,我会在下一节中对T4语法进行梳理讲解一下。

  • 相关阅读:
    setTimeout()和setInterval() 何时被调用执行
    Linux下常用SVN命令
    IE6/7/8兼容问题、时间对象返回NAN
    BX2001: IE 支持使用 window.clipboardData 访问系统剪贴板,Chrome 和 Safari 中存在类似的 Clipboard 对象但尚未实现,Firefox 和 Opera 不支持这类对象
    IE的layout属性详解
    css expression
    IE6/IE7下绝对定位position:absolute和margin的冲突问题解决
    优雅绝妙的Javascript跨域问题解决方案
    javascript的闭包
    使用X-UA-Compatible来设置IE8/IE9兼容模式
  • 原文地址:https://www.cnblogs.com/damonlan/p/2306663.html
Copyright © 2011-2022 走看看