1.什么是T4?

T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。简单的说就是可以根据模板生成你想要的文件,可以使类文件,文本文件,HTML等等。

VS本身只提供一套基于T4引擎的代码生成的执行环境,由下面程序集构成:

Microsoft.VisualStudio.TextTemplating.10.0.dll

Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll

Microsoft.VisualStudio.TextTemplating.Modeling.10.0.dll

Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll

2.vs插件的安装

T4的编辑工具下载地址http://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html

VS默认的编辑工具无高亮,无提示,错误不易定位。 没这个工具,真心不想写任何T4代码。

3.T4初体验

首先我们新建一个类库,在添加新项,选择文本文件,后缀名xx.tt.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
//------------------------------------------------------------------------------
// <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/>
// 此代码由T4模板自动生成
// 生成时间 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#> by 枫伶忆
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
// QQ:549387177
// <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------ using System;
public class UserEntity
{
public string F_Id { get; set; }
public string F_Account { get; set; }
public string F_RealName { get; set; }
public string F_NickName { get; set; }
public string F_HeadIcon { get; set; }
public bool? F_Gender { get; set; }
public DateTime? F_Birthday { get; set; }
public string F_MobilePhone { get; set; }
public string F_Email { get; set; }
public string F_WeChat { get; set; }
public string F_ManagerId { get; set; }
public int? F_SecurityLevel { get; set; }
public string F_Signature { get; set; }
public string F_OrganizeId { get; set; }
public string F_DepartmentId { get; set; }
public string F_RoleId { get; set; }
public string F_DutyId { get; set; }
public bool? F_IsAdministrator { get; set; }
public int? F_SortCode { get; set; }
public bool? F_DeleteMark { get; set; }
public bool? F_EnabledMark { get; set; }
public string F_Description { get; set; }
public DateTime? F_CreatorTime { get; set; }
public string F_CreatorUserId { get; set; }
public DateTime? F_LastModifyTime { get; set; }
public string F_LastModifyUserId { get; set; }
public DateTime? F_DeleteTime { get; set; }
public string F_DeleteUserId { get; set; }
}
//------------------------------------------------------------------------------
// <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/>
// 此代码由T4模板自动生成
// 生成时间 2016-10-02 07:09:29 by 枫伶忆
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
// QQ:549387177
// <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/>
//------------------------------------------------------------------------------ using System;
public class UserEntity
{
public string F_Id { get; set; }
public string F_Account { get; set; }
public string F_RealName { get; set; }
public string F_NickName { get; set; }
public string F_HeadIcon { get; set; }
public bool? F_Gender { get; set; }
public DateTime? F_Birthday { get; set; }
public string F_MobilePhone { get; set; }
public string F_Email { get; set; }
public string F_WeChat { get; set; }
public string F_ManagerId { get; set; }
public int? F_SecurityLevel { get; set; }
public string F_Signature { get; set; }
public string F_OrganizeId { get; set; }
public string F_DepartmentId { get; set; }
public string F_RoleId { get; set; }
public string F_DutyId { get; set; }
public bool? F_IsAdministrator { get; set; }
public int? F_SortCode { get; set; }
public bool? F_DeleteMark { get; set; }
public bool? F_EnabledMark { get; set; }
public string F_Description { get; set; }
public DateTime? F_CreatorTime { get; set; }
public string F_CreatorUserId { get; set; }
public DateTime? F_LastModifyTime { get; set; }
public string F_LastModifyUserId { get; set; }
public DateTime? F_DeleteTime { get; set; }
public string F_DeleteUserId { get; set; }
}

上面的T4模板生成的代码类文件就是这样。T4所能做的事情远远超出这些,在这里我们首先了解一下T4的基本语法。

4.T4语法

细心的朋友刚才肯定看到了模板中的一些奇怪的语法,说它奇怪的是T4语法和c#语法类似,但是有不同于c#语法。

T4语法主要包括三类:1指令 2文本块 3指令块

<# 标准控制块 #> 可以包含语句。

<#= 表达式控制块 #> 可以包含表达式。

<#+ 类特征控制块 #> 可以包含方法、字段和属性,就像一个类的内部

指令主要包括template, output, assembly, import, include等类型

在这里是指令T4语法以<#开头结尾

<#@ 指令 属性=“值”#>

第一种指令集

4.1模板指令

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

4.1.1 langeuage:输出语言,有效值C#、VB,默认为C#

4.1.2 debug:是否启用调试,有效值true、false,默认为false。

4.1.3 hostspecific:有效值true、false,默认为false。如果将此特性的值设置为 true,则会将名为 Host 的属性添加到由文本模板生成的类中。 该属性是对转换引擎的宿主的引用,并声明为Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。

4.1.4 inherits:可以指定模板的程序代码可以继承自另一个类,这个类也可以从文本模板生成。目前木有使用过,基本上可以忽略

4.2输出指令

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

4.2.1 告诉T4引擎生成文件的后缀名是.cs;

4.3程序集指令

<#@ assembly name="System"#>

4.3.1 告诉T4引擎编译运行时引用System程序集

$(SolutionDir):当前项目所在解决方案目录
$(ProjectDir):当前项目所在目录
$(TargetPath):当前项目编译输出文件绝对路径
$(TargetDir):当前项目编译输出目录,即web项目的Bin目录,控制台、类库项目bin目录下的debug或release目录(取决于当前的编译模式)

举个例子:比如我们在D盘根目录建立了一个控制台项目MyTest,解决方案目录为D:\Feng,项目目录为
D:\Feng\MyTest,那么此时在Debug编译模式下
$(SolutionDir)的值为D:\Feng
$(ProjectDir)的值为D:\Feng\MyTest
$(TargetPath)值为D:\Feng\MyTest\bin\Debug\MyTest.exe
$(TargetDir)值为D:\Feng\MyTest\bin\Debug\

4.4导入指令

<#@ import namespace="System.Data"#>

4.4.1告诉T4引擎编译运行时引用某个名称空间。在 Visual Studio T4 文本模板的代码块中,import 指令允许您在不提供完全限定名称的情况下引用另一个命名空间中的元素。 它等效于 C# 中的 using 或 Visual Basic 中的 imports。默认已经导入了System命名空间的引用。

4.5包含指令

<#@ include file="Base.ttinclude"#>

4.5.1 运行时引用某个文件,类似于JS的引用。

4.5.2 包含指令可以提高代码复用率,比如我们可以将一些常用的程序集、命名空间引用放到一个文件里,使用时仅需要引用下即可,省去了每次都要重新引用一遍的烦恼,如我们建立Reference.ttinclude文件,里面包含了我们平时常用的程序集引用。

<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Data.DataSetExtensions.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>

使用时只需要使用包含指令引用下即可

<#@ include file="$(ProjectDir)Reference.ttinclude"  #>

4.6 参数指令

<#@ parameter type="string" name="ParameterName" #>

顾名思义就是定义一个参数在其他的地方使用。

第二种 文本块

文本块直接向输出文件插入文本。 文本块没有特殊格式,就像我们刚才初体验中写的类一样。

第三种 指令块

主要用于控制文本的输出。在控制块可以写任意的C#代码。

标准控制块:

<#
for(int i = ; i < ; i++)
{
#>
Hello World!
<#
}
#>

表达式控制块:

<#=  +  #> 

类控制块:

<#+
public class config
{
public static readonly string ConnectionString = "Data Source=(local);Initial Catalog=NFineBase;User ID=sa;Password=hjf19870810;";
public static readonly string DbDatabase = "NFineBase";
public static readonly string TableName = "Sys_Test";
}
#>

例如在这里写一个类,在其他的地方我们可以使用这个类的东西。

其实对于“T4模板”的学习,讲得最详细的还是MSDN,下面给出对应的链接,可以点开深入的了解。

T4语法快速入门的更多相关文章

  1. Objective-C基础语法快速入门

    Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...

  2. Less 语法快速入门

    Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...

  3. t4模版快速入门

    语法 主要包括指令.文本块.控制块. 1.指令 指令主要包括template, output, assembly, import, include等类型,用以告诉T4引擎如何编译和运行一个模板.这些指 ...

  4. shell语法快速入门(1)

    #得到绝对路径 DIR=$(cd `dirname $0`;pwd) $DIR/file.txt #去掉#注释 egrep -v "(#|^$)" /etc/zabbix/zabb ...

  5. python语法快速入门(1)

    http://www.runoob.com/python/python-tutorial.html Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言 ...

  6. Ruby 语法快速入门

    作用域:指的是类,模块,方法 常量:无需指定类型,全大写 FANS = 100 puts "We have" + FANS.to_s + "fans" 变量 局 ...

  7. XML随笔:语法快速入门及当下流行的RSS简析

    今天是本人第一次写博客,之前闭门造车闹出过很多笑话,恰巧这几天刚刚重温了一遍XML的知识,决定把XML的知识再来从头到尾的理一遍,感触颇多,今天分享给大家.希望大家能多多注意其中的要点. 1.定义 首 ...

  8. Markdown 语法快速入门手册

    Markdown 是一种轻量级标记语言,能将文本换成有效的XHTML(或者HTML)文档,它的目标是实现易读易写,成为一种适用于网络的书写语言. Markdown 语法简洁明了,易于掌握,所以用它来写 ...

  9. Vue3语法快速入门以及写一个倒计时组件

    Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...

随机推荐

  1. 上海邮政EMS海关清关(个人) 流程

    最近雾埋越来越严重,上个星期买了一个tacx骑行台,不料运气欠佳,被税了.那就去乖乖缴税吧. 拿着EMS的通知单(没有通知单就不要去了),到通知单指定的地址(上海有两处,我的是武定路458号)清关提货 ...

  2. 从《BLAME!》说开去——新一代生产级卡通真实感混合的渲染方案

    <BLAME!>是Polygon Pictures Inc.(以下简称PPI)创业33周年以来制作的第一部CG剧场电影,故事来自于贰瓶勉的同名漫画作品(中文译名为<探索者>或者 ...

  3. Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战

     Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 3 ...

  4. 原创教程:SpagoBI4.2汉化及配置Mysql数据库教程

    SpagoBI4.2汉化及配置Mysql数据库教程 商务智能套件SpagoBI提供一个基于J2EE的框架用于管理BI对象如报表.OLAP分析.仪表盘.记分卡以及数据挖掘模型等的开源BI产品.它提供的B ...

  5. 在Windows2008系统中利用IIS建立FTP服务器

    一.服务器管理器   1.2008的系统使用服务器管理器,选择角色,因为我之前已经开启了IIS服务器角色,所以我现在只要添加角色服务即可,如果你没有开启过的话,直接添加角色即可.   2.选择WEB服 ...

  6. CSS3 页面跳转的动画效果

    从左侧弹出: var windowWidth = window.innerWidth; $(atlas_list).css({ "transition":"none&qu ...

  7. Android开发之ProgressDialog在独立Thread线程中更新进度

    简单的需求:在一个工作Thread中更新进度对话框ProgressDialog 遇到的问题: 1,创建需要Context,这个需要传进来 2,Thread中不能创建ProgressDialog,否则需 ...

  8. WIN8 下Cisco VPN连接 出现vpn 422 failed to enable virtual adapter错误

    今天在家用VPN软件连接,出现了“vpn 422 failed to enable virtual adapter”的错误,系统安装的是Win8专业版32位,百度了半天又很多方法解决不了,后来发现了一 ...

  9. Fabric自动部署太方便了

    之前不知道有Fabric工具,每次发布程序到服务器上的时候,基本流程:本地打包程序 -> Ftp上传 -> 停服务器Apache -> 覆盖文件 -> 启动Apache, 非常 ...

  10. Android之线程回掉更新ui

    一:工作线程中的回掉更新UI public class MainActivity extends AppCompatActivity { private int i; private Callback ...