T4学习- 3、创建运行时模板
使用 Visual Studio 预处理过的文本模板,可以在运行时在应用程序中生成文本字符串。 执行应用程序的计算机不必具有 Visual Studio。 预处理过的模板有时称为“运行时文本模板”。每个模板都包含将显示在生成的字符串中的文本和程序代码的片段。 程序片段为字符串的可变部分提供值,还控制条件部分和重复部分。
创建运行时文本模板
一、具体步骤:
1、在解决方案资源管理器中,右击项目,指向“添加”,再单击“新建项”。
2、在“添加新项”对话框中,选择“运行时文本模板”。 (在 Visual Basic 中的“常用项\常规”下查看。)
3、键入模板文件的名称,如:MyWebPage
4、单击“添加”。
将创建一个扩展名为 .tt 的新文件。 该文件的“自定义工具”属性设置为 TextTemplatingFilePreprocessor。
与之前讲到的设计时模板不同。
设计时模板: TextTemplatingFileGenerator
运行时模板:TextTemplatingFilePreprocessor
模板转换:
当然设计时模板可以转为运行时模板,只要将该文件的“自定义工具”属性设置为 TextTemplatingFilePreprocessor即可。
但是运行时模板很多情况下不能转为设计时模板。
二、实例--显示课程网页
新建模板后,自动生成了模板的部分类文件。可以展开 .tt 文件节点,此附属文件包含一个分部类,该类包含一个名为 TransformText() 的方法。这个方法中的内容会根据模板内容的变化而变化,其实就是模板代码转为C#代码。此方法可以从应用程序中调用。
我们另外新建一个此分部类的文件,以模板名+code结尾:MyWebPageCode.cs,在这里我们可以声明模板需要的变量、方法。
这里我们需要设置课程集合。
using System.Collections.Generic; namespace T4Sample
{
partial class MyWebPage
{
private List<string> items; public MyWebPage(List<string> data)
{
this.items = data;
}
}
}
修改模板:
<#@ template language="C#" #>
<html>
<body>
<h1>计算机课程</h2>
<table>
<# foreach(string item in Items)
{ #>
<tr><td>Course name : <#= item #> </td></tr>
<# } #>
</table>
</body>
</html>
查看附属文件的部分类,方法:TransformText()
public virtual string TransformText()
{
this.GenerationEnvironment = null;
this.Write("<html>\r\n<body>\r\n<h1>计算机课程</h2>\r\n<table>\r\n "); #line 6 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
foreach(string item in Items)
{ #line default
#line hidden
this.Write(" <tr><td>Course name : "); #line 8 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item)); #line default
#line hidden
this.Write(" </td></tr>\r\n "); #line 9 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
} #line default
#line hidden
this.Write(" </table>\r\n </body>\r\n </html>");
return this.GenerationEnvironment.ToString();
}
程序调用,对模板变量赋值,并调用模板,输出文件。
static void Main(string[] args)
{
List<string> items = new List<string>();
items.Add("计算机基础");
items.Add("数据库");
items.Add("计算机网络");
MyWebPage page = new MyWebPage(items);
String pageContent = page.TransformText();
//如果有汉字,需要设置编码格式
System.IO.File.WriteAllText("outputPage.html", pageContent,Encoding.UTF8);
}
运行程序,生成模板:
生成的HTML
<html><body>
<h1>计算机课程</h2>
<table>
<tr><td>Course name : 计算机基础 </td></tr>
<tr><td>Course name : 数据库 </td></tr>
<tr><td>Course name : 计算机网络 </td></tr>
</table>
</body></html>
浏览器打开效果:
在运行时生成文本,若要在特定命名空间中放置已生成的类,请设置文本模板文件的“自定义工具命名空间”属性。
三、基本原理
由上述实例,我们已经基本了解了运行时模板的基本步骤,现在总结一下运行时模板的基本原理。
我们通常也通过C#输出文件,可能也要按照一定的格式来生成。其实这里的运行时模板,就是这样一个工具,设定好模板后,然后VS自动转为C#代码,在部分类中TransformText()方法,我们可以找到踪迹。
运行时模板,简单的说就是可视化的C#代码生成器。
运行时模板,提供了可视化功能,将夹杂在C#代码中的模板代码拿出来,让我们更加直观的看到模板的真实样子。方便进行修改和维护。
运行时模板就好比C#代码,比起设计时模板,方便跟踪调试。
T4学习- 3、创建运行时模板的更多相关文章
- T4学习- 2、创建设计时模板
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的关键 ...
- T4运行时模板
可以通过Visual Studio运行时文本模板在您的应用程序在运行时生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 运行库模板有时称为"预处理文本模板&quo ...
- java 面向对象(四十):反射(四)反射应用一:创建运行时类的对象
1.代码举例Class<Person> clazz = Person.class; Person obj = clazz.newInstance();System.out.println( ...
- JAVA_基础反射创建运行时类的对象
通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...
- 深入探索.NET框架内部了解CLR如何创建运行时对象
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集 ...
- 深入探索.NET内部了解CLR如何创建运行时对象
前言 SystemDomain, SharedDomain, and DefaultDomain. 对象布局和内存细节. 方法表布局. 方法分派(Method dispatching). 因为公共语言 ...
- webpack学习:uni运行时代码解读一 (页面初始化加载)
uni的vue代码是如何在微信小程序里面执行的,对此比较感兴趣所以去调试学习了一波. 准备工作 // 在vue.config.js里打开非压缩的代码 module.exports = { config ...
- 【初级坑跳跳跳】第一个应用布局学习的代码运行时出错(manifest里未将activity先注册,控件错误)
首先,根据书中想要实现的结果,看了下书中代码,大致知道布局是怎么样的,然后根据图片自己写xml, 1.运行时第一个坑是 忘记在AndroidManifest.xml里先注册activity,导致运行时 ...
- 学习笔记-jvm运行时数据区
按照线程私有和共享区域来划分 线程私有 程序计数器 指向当前线程正在执行的字节码行号地址,如果是本地方法,值为undefined 虚拟机中唯一不会oom的区域 为什么会有程序计数器 - java天生多 ...
随机推荐
- WPF 中Canvas图形移动、缩放代码
从Flash转C#,很多内容一知半解,边摸索边前进,代码粗糙,权当留个脚印. 只是想得到一个基础的移动和缩放功能的界面,找了很久都是画线.画矩形等基础形状的代码,移动和缩放说的并不清晰,只能自己努力来 ...
- 数字三角形 (简单DP)
问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸的美国.美国人民的生活非常有意思,经常会有形形色色.奇奇怪怪的活动举办,这不,小Hi和小Ho刚刚下飞 ...
- ASP.NET MVC加载用户控件后并获取其内控件值或赋值
有网友看了这篇<ASP.NET MVC加载ASCX之后,并为之赋值>http://www.cnblogs.com/insus/p/3643254.html 之后,问及Insus.NET,不 ...
- 如何一键式搭建微信小程序
有了微信小程序,对你到底意味着什么? 对于用户来说,再也不用担心手机的内存不够用了!一个小程序只有1M,随便卸载一个App,就能安装很多小程序! 对于老板来说,你不再需要花费数十万来去请外包公司帮你去 ...
- @Html.Raw() 与Newtonsoft.Json.JsonConvert.SerializeObject()
一.后台 ViewBag.TypeList = typeList; 二.前台C# @{ var typeListFirst = ViewBag.TypeList;} 三.前台js中 var t ...
- Spring boot实现自定义拦截器
Sprintboot的拦截器提供了精细的控制:在request被响应之前.request被响应之后.request全部结束之后至视图渲染之前 三个时间点,我们都可以通过编写他们的函数来控制. 首先新建 ...
- centos7: ifconfig出现command not found解决办法
问题 说下我linux配置情况,不一样的可以选择借鉴我的办法. 在虚拟机中以最小化方式安装centos7,ifconfig命令无效,而且在sbin目录中没有ifconfig文件. 原因 这是因为cen ...
- Incircle and Circumcircle(二分+几何)浙大月赛zoj3806(详解版)图
Incircle and Circumcircle Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A triangle is o ...
- 卸载阿里云自带svn
- 函数表达式(JavaScript高程笔记)
函数声明 特点:函数声明提升(执行代码之前解析器会先读取函数声明,并使其在执行任何代码之前可用,意味着可以把函数声明放在调用语句之后) function functionName(arg0,arg1) ...