阅读目录

 

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 = 0; i < 4; i++)
{
#>
Hello World!
<#
}
#>

表达式控制块:

<#= 1 + 1 #> 

类控制块:

<#+
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. T4语法快速入门

    1.什么是T4? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolk ...

  2. [转]T4系列文章之3:T4语法的介绍

    本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html 因为这段时间一直都没空,我也不知道有没有对人T4感兴趣,但不管 ...

  3. T4

    Text Template Transformation Toolkit T4语法感觉有点像aspx的视图模板<% %>. 使用可以通过VS扩展和更新安装"T4 Toolbox ...

  4. 用T4 Template生成代码

    1 T4语法 T4的语法与ASP.NET的方式比较类似.主要包括指令.文本块.控制块. 1.1    指令 指令主要包括template, output, assembly, import, incl ...

  5. NFine框架的T4模板

    1.前言 前段时间在网上看到一个开源框架很好的.开源:ASP.NET MVC+EF6+Bootstrap开发框架,写代码就是比较比较麻烦,分层比较多,对于我这种偷懒的人就想到了写一个T4模板.不了解框 ...

  6. T4模板根据DB生成实体类

    1.前言 为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要是能写出一个T4模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多好,心动不如行动.记得使用T4 ...

  7. T4 模板入门

    T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolkit)是微软官方在 ...

  8. T4系列文章之1:认识T4

    一.导读 MSDN:Code Generation and T4 Text Templates 博客园:编写T4模板进行代码生成 Oleg Sych系列文章:http://www.olegsych.c ...

  9. T4 模板

    T4模板入门 T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolkit ...

随机推荐

  1. [转]Linux下/proc目录简介

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  2. [Windows Server 2012] Filezilla安装方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...

  3. Android 双屏异显

    android双屏是克隆模式,如果要在第二屏幕显示不同内容,需要自定义一个Presentation类 1.先设置权限 (刚开始折腾很久没有效果,后来发现是没设置权限) <!-- 显示系统窗口权限 ...

  4. css的基础知识1

    总结:css引用:1内联:在标签中加style属性,<标签名 style="样式1:样式值1:样式2:样式值2"> </标签名>.2.内嵌:在head标签中 ...

  5. How To:使用dmidecode获取机器序列号(Serial number)

    使用dmidecode可以获取关于机器的诸多信息,比如机器的序列号   [root@dc1db01 ~]# dmidecode -s system-serial-number   processor的 ...

  6. 总结这几天js的学习内容

    对js中难点的理解 1.把变量对象像遍历数组一样简单 对于数组 ,迭代出来的是数组元素,对于对象 ,迭代出来的是对象的属性: var obj = { w: "wen", j: &q ...

  7. Vivaldi解决flash插件问题

    Vivaldi浏览器 Vivaldi是Opera联合创始人.前CEO谭咏文(Jon von Tetzchner)2015年1月27日发布的一款浏览器,具有个性化的笔记功能,带有迷你屏幕截图的书签,以及 ...

  8. 15.most_fields策略进行cross-fields search

    主要知识点: cross-fields 的使用场景 cross-fields 使用方法 cross-fields 的缺点     一.cross-fields 的使用场景     cross-fiel ...

  9. Problem 29

    Problem 29 Consider all integer combinations of ab for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5: 仔细看看以下a与b的组合 22=4, 2 ...

  10. Centos下安装mysql(二进制版)

    1.下载安装包,选择相应的平台.版本,比如,选择64位Linux平台下的MySQL二进制包“Linux-Generic (glibc 2.5)(x86,64-bit),Compressed” 如:#w ...