使用 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、创建运行时模板的更多相关文章

  1. T4学习- 2、创建设计时模板

    使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的关键 ...

  2. T4运行时模板

    可以通过Visual Studio运行时文本模板在您的应用程序在运行时生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 运行库模板有时称为"预处理文本模板&quo ...

  3. java 面向对象(四十):反射(四)反射应用一:创建运行时类的对象

    1.代码举例Class<Person> clazz = Person.class; Person obj = clazz.newInstance();System.out.println( ...

  4. JAVA_基础反射创建运行时类的对象

    通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...

  5. 深入探索.NET框架内部了解CLR如何创建运行时对象

    原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集 ...

  6. 深入探索.NET内部了解CLR如何创建运行时对象

    前言 SystemDomain, SharedDomain, and DefaultDomain. 对象布局和内存细节. 方法表布局. 方法分派(Method dispatching). 因为公共语言 ...

  7. webpack学习:uni运行时代码解读一 (页面初始化加载)

    uni的vue代码是如何在微信小程序里面执行的,对此比较感兴趣所以去调试学习了一波. 准备工作 // 在vue.config.js里打开非压缩的代码 module.exports = { config ...

  8. 【初级坑跳跳跳】第一个应用布局学习的代码运行时出错(manifest里未将activity先注册,控件错误)

    首先,根据书中想要实现的结果,看了下书中代码,大致知道布局是怎么样的,然后根据图片自己写xml, 1.运行时第一个坑是 忘记在AndroidManifest.xml里先注册activity,导致运行时 ...

  9. 学习笔记-jvm运行时数据区

    按照线程私有和共享区域来划分 线程私有 程序计数器 指向当前线程正在执行的字节码行号地址,如果是本地方法,值为undefined 虚拟机中唯一不会oom的区域 为什么会有程序计数器 - java天生多 ...

随机推荐

  1. CAlayer二

    下面学习一下图层的anchorPoint,position属性在ViewDidLoad中self.View添加View1,在View1中添加图层calayer self.view1=[[UIView ...

  2. 以ORM的思路来从Excel文件中读取JSON数据列表

    1.一个常见的问题就是如何读取excel. 这里面有几个分支的问题,一个是如何使用poi读取excel,网上例子很多,但是这只解决了第一步.如何将excel读取入一定的数据结构这是第二个问题,还有就是 ...

  3. 获取当前iframe动态加载文档的href

    Insus.NET想实现一个功能,一个旧的站点A,它有两个网页logon.aspx和Default.aspx(登录成功能访问).由于某些原因,需另建一个新站点B,这个新站点B也有两个网页B_Index ...

  4. 了解java虚拟机—JVM相关参数设置(2)

    1.   JVM相关参数设置 JVM相关配置 -XX:+PrintGC 两次次YoungGC,两次FullGC. -XX:+PrintGCDetails 打印GC时的内存,并且在程序结束时打印堆内存使 ...

  5. Hashmat the brave warrior(UVa10055)简单题

    Problem A Hashmat the brave warrior Input: standard input Output: standard output Hashmat is a brave ...

  6. SpringBoot整合Netty

    总体来说只需要三个步骤,下面详细介绍 第一步 创建SpringBoot工程snetty 第二步 创建子模块也就是ModuleClient,Server,均为SpringBoot工程 第三步 将服务器端 ...

  7. Java反射的好处

    反射的好处 我们在第一次接触反射的时候,总会有个很大的疑问,反射看起来好麻烦啊,各种get.get,他究竟有什么好处,能用来做什么呢? 我们先来看一下<编程思想>这本书中是怎么说的. RT ...

  8. Mybatis一对一,一对多

    一对一 假如有student表(学生表)和student_card表(学生证表). student表中有一个字段self_card用来查student_card,student_card表中有一个st ...

  9. 【15】模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等.在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简 ...

  10. require.js的基本概念及使用流程(1)

    今天,我们来说一说requireJS的基本概念,在下一篇随笔中我们再去讨论讨论requireJS的使用步骤 这一篇都是一些概念性比较强的东西,希望大家擦亮自己的钛合金狗眼好好看看概念,好吧 首先,什么 ...