T4模板_T4基本结构
T4文本模板由 指令块、文本块、控制块 组成。
一. 指令块(MSDN文本模板指令)
指令块以@开头,基本的指令块包括<#@ template #> 、<#@ parameter# >、
<#@ assembly>、<#@ import #> 、<#@ include#>、<#@ output#>
其中<#@ template #>是必须的,定义了该模板的基本属性
1.模板指令:
<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>
模板指令所有特性都是可选的。
compilerOptions特性:对运行时模板忽略。
culture特性指定将表达式转换为文本时要使用的区域性。表示为xx-XX形式,有效值有en-US、ja-JP、de-CH、de-DE
debug特性 是否启用调试
inherits特性可以指定模板的程序代码可以继承自另一个类,这个类也可以是模板生成的。如果不指定inherits则会从您的文本模板生成基类和派生类。
visibility 可见性特性,有效值 public(默认)、internal
2.参数指令
<#@ parameter type="Full.TypeName" name="ParameterName" #>
3.输出指令
<#@ output extension=".fileNameExtension" [encoding="encoding"] #>
extension特性 指定生成的文本输出文件的文件扩展名,可接受任何有效的文件扩展名。默认值.cs
encoding特性指定生成输出文件时要使用的编码,比如encoding="utf-8"
4.程序集指令
<#@ assembly name="[assembly strong name|assembly file name]" #>
在预处理文本模板中,assembly特性无效,改为在VS的"引用"中添加。如果程序集已经在GAC里面注册,那么只需要写上程序集名称即可,如<#@ assembly name="System.Data.dll" #>,否则需要指定程序集的物理路径
5.导入指令
<#@ import namespace="namespace" #>
默认情况下会导入System命名空间的引用。
6.包含指令
<#@ include file="filePath" [once="true"] #>
file可以使绝对的或相对当前模板文件。file可以包括用“%”分割的环境变量,如<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>包含指令可以提高代码的复用率,比如可以将一些常用的程序集、命名空间引用放到一个文件里,使用时仅需要应用即可,如,建立Reference.ttinclude文件,里面包含了我们平时常用的程序集引用,使用时只需要使用包含指令引用即可:
<#@ include file="$(ProjectDir)Reference.ttinclude" #>
二 .文本块(MSDN文本块)
文本块直接向输出文件插入文本。文本块没有特殊格式,例如,下面的文本模板将生成一个包含“Hello”的文本文件
<#@ output extension=".txt" #>
Hello
三 .控制块(MSDN控制块)
<#@ template language="VB" #>
注:用于编写的控制块代码的语言与生成的文本语言无关。
3.1标准控制块
在模板文件中可以混合使用任意数量的文本块和标准控制块。但是不能再控制块中嵌套控制块。每个标准控制块都以<# #>符号分隔。例如:使用下面的空子块和文本块,输出结果“0,1,2,3,4 Hello!”:
<#
for(int i = ; i < ; i++)
{
Write(i + ", ");
}
Write("");
#> Hello!
还可以交错文本和代码,而不必使用显示Write()语句,以下输出“Hello!”4次:
<#
for(int i=;i<;i++)
{
#>
Hello! <# } #>
3.2 表达式控制块
表达式控制块计算表达式并将其转换为字符串,输入到文件中。 表达式控制块以<#=... #>符号分隔。以下输出文件包含“5”:
<#=+ #>
注意:开始符号有3个“<#=”。 表达式可以包含作用域的任何变量,如:
<#@ output extension=".txt" #>
<#
for(int i=;i<;i++)
{
#>
this is hello number <#=i+ #>: Hello!
<#
}
#>
3.3 类功能控制块
类功能控制块定义 属性、方法或不应包含在主转换中的所有其他代码。类功能块常用于编写帮助器函数。通常,类功能块位于单独的文件中,这样他们可以包含在多个文本模板中。
类功能控制块以<#+...#>符号分隔。例如以下模板文件声明并使用一个方法:
<#@ output extension=".txt" #>
Squares:
<#
for(int i=;i<;i++)
{
#>
The squares of <#=i #> is <#= Square(i+) #>.
<#
}
#>
That is the end of list.
<#+ //Start of class feature block
private int Square(int i)
{
return i*i;
}
#>
类功能块必须编写在文档末尾
类功能块可以包含文本块
List of Squares:
<#
for(int i=;i<;i++)
{ WriteSquareLine(i); }
#>
End of List.
<#+ //class feature Block
private void WriteSquareLine(int i)
{
#>
the Square of <#= i #> is <#= i*i #>.
<#
}
#>
T4模板_T4基本结构的更多相关文章
- T4模板的基本结构
(转自:http://www.cnblogs.com/yank/archive/2012/02/14/2342287.html) T4模板的基本结构 代码块的总体分类,就是两种:文本.程序脚本. 我感 ...
- T4 模板 vs2010
参阅:http://dotnet.cnblogs.com/page/78398/ T4模板的定义非常简单,整个模板的内容包括两种形式:静态形式和动态动态.前者就是直接写在模板中作为原样输出的文本,后者 ...
- 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...
- 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)
对于T4模板很多朋友都不太熟悉,它在项目开发中,会帮我们减轻很大的工作量,提升我们的开发效率,减少出错概率.所以学好T4模板的应用,对于开发人员来说是非常重要的. 园子里对于T4模板的介绍与资料已经太 ...
- MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...
- T4模板——一个神奇的代码生成器
利用T4模板,可以很方便的从数据库映射成Model模型,相当于动软等功效.但动软是可以直接生成三层,抽象工厂的,T4没那么牛叉,所以我们一般只用作生成Modle或者Server等指定方法了. 废话少说 ...
- T4模板
T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文本模板,即一种自定义规则的代码生成器.根据业务模型可生成任何形式的文本文件或供程序调 ...
- T4模板之初体验(语法)
一.什么是T4模板 T4是Text Template Transformation Toolkit(文本模板转换工具包)的四个英文首字母的简称.是微软提供的一种代码生成引擎. 在ADO.NET实体数据 ...
- T4 模板 : 一种提升ASP.NET MVC开发速度方法
最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释, ...
随机推荐
- 大数据入门第五天——离线计算之hadoop(上)概述与集群安装
一.概述 根据之前的凡技术必登其官网的原则,我们当然先得找到它的官网:http://hadoop.apache.org/ 1.什么是hadoop 先看官网介绍: The Apache™ Hadoop® ...
- JavaWeb基础—项目名的写法
${pageContext.request.contextPath} //jsp中 request.getContextPath() //Servlet中 两者获取到的都是"/项目名称&qu ...
- python基础学习1-SET 集合
# -*- coding:utf-8 -*- set集合 无序不重复的序列 se = {"a","b","c"} #创建SET集合 prin ...
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
场景 1.使用win32绘图时, 最简单的api是使用 graphics.DrawImage(image,x,y)来绘制, 可是这个api有个坑,它的图片显示完整和设备分辨率(显卡)有关. 说明 1. ...
- 前端- JavaScript - 总结
1.JavaScript的介绍 javaScript是一种web前端的描述语言,也是一种基于对象(object)和事件驱动(Event Driven)的.安全性好的脚本语言. 它运行在客户端从而减轻服 ...
- 【fake题解】[NOI2013]向量内积
[fake题解][NOI2013]向量内积 做法1 大暴力.哪里不会T哪里. 做法2 所有数都%=k不影响结果.(废话 k的取值只有2和3,所以肯定是要分类讨论的.k=2肯定简单些啦. k=2 出现的 ...
- Flutter - Stateful(有状态) 和 stateless(无状态) widgets
Stateful(有状态) 和 stateless(无状态) widgets 有些widgets是有状态的, 有些是无状态的 如果用户与widget交互,widget会发生变化,那么它就是有状态的. ...
- selenium+java多层级frame切换的问题
关于selenium多层iframe切换,及iframe没有id和name属性的情况下进行切换的问题.(如下图:) 问题: 1. 在切入到frame:left中后,直接切换其他同级和上级frame报错 ...
- 2018年美国大学生数学建模竞赛(MCM/ICM) D题解题思路
首先整个赛题是一道集选址,优化,评价,预测的综合性赛题,对于任务 1,包括三个小问题,第一是有望完全电动化,那么就需要评价什么叫完全电动化,所以先建立一个基本的标准,比如人车比例达到多少.需要多少充电 ...
- CentOS 7.X下 -- 配置nginx正向代理支持https
环境说明: 本次测试使用的操作系统为:CentOS 7.2 x86 64位 最小化安装的操作系统,系统基础优化请参考:https://www.cnblogs.com/hei-ma/p/9506623. ...