文章目录

  • 介绍
    • 简单说下什么是t4模版
  • 具体使用方式
    • TransformText方法
    • 自定义T4模板引擎
    • 两种方式的比较
  • 总结

介绍

最近工作中需要按一定的模板模型生成指定的文件,虽然可以直接拼接字符串来完成(动软代码生成器就是这么干的),但是我还是觉得使用一个模板引擎比较好,对于以后的扩展也比较友好。对于.net的程序员来说,其自带的T4模板就可以完成这个任务,但是由于长时间没有使用了,所以稍微花了点时间研究了下,并总结了两种方式,所以就有了这篇文章,也方便以后方便的时候查阅。

简单说下什么是t4模版

T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit

T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity FramworkDataContext模板等等。

可以所T4模版课快速帮你生产实体类或者需要重复编写但是格式一致的代码。

具体使用方式

网上关于T4模板的文章也是有的,但是总体感觉比较杂,没有对其进行总结的文章。这里整理了两种生成方式,一种是通过自动生成的TransformText方法来完成最终文件的生成,另一个是通过自定义T4模板来完成最终文件的生成,之前我做个一个代码生成器,就是通过自定义的方式来完成的。

TransformText方法

关于这种方式的案例,我打算借用网上的MultiArticle案例进行说明。

1、创建一个Console项目。

2、添加一个MultiArticle类和同名的.tt模板文件。

3、MultiArticle类的的内容如下。

public class Article
{public string Title { get; set; }public string Content { get; set; }
}
public partial class MultiArticle
{public string Subject { get; set; }public List<Article> ArticleList { get; set; }public MultiArticle(string subject, List<Article> articles) { Subject = subject; ArticleList = articles; }
}

这里需要特别注意的是,类一定要定义为 部分类这个非常重要。否则最终将不能调用TransformText方法。

4、MultiArticle.tt的内容如下。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".html" #><div style="text-align:center;"><table width="600" cellpadding="0" cellspacing="0" border="0" style="margin:0 auto;"><tbody><tr><td><div style="width:600px;text-align:left;font:12px/15px simsun;color:#000;background:#fff;"><!-- 水平居中的邮件 --><h1><#=Subject #></h2><table><# foreach(Article item in ArticleList){ #><tr><td> <#= item.Title #> </td><td> <#= item.Content #> </td></tr><# } #></table></div></td></tr></tbody></table>
</div>

这里需要注意的是,模板的名称一定要和类的名称一样。另外就是模板名称右击==》属性后,【自定义工具】中的内容需要改为TextTemplatingFilePreprocessor;【生成操作】改为;【复制到输出目录】是不复制

完成上面的内容后,可以在模板下看到生成的MultiArticle类,这个是自动生成的,切记不可随便改动

5、类Program中的Main方法如下。

string subject = "最新消息";
var artList = new List<Article>();
for (int i = 0; i < 4; i++)
{Article art = new Article();art.Title = "标题" + i + ":" + Guid.NewGuid();art.Content = "内容" + i + ":" + Guid.NewGuid();artList.Add(art);
}
MultiArticle mod = new MultiArticle(subject, artList);
//TransformText方法是模板编译时自动产生的,
//这也是前面有提到的,模板MultiArticle.tt的命名要与MultiArticleCode.cs中的类名相同的因,
//利用分部类partial,就可以调用该TransformText方法了。
String pageContent = mod.TransformText();
//将pageContent保存到任何你想保存的地方
System.IO.File.WriteAllText("outputPage.html", pageContent, Encoding.UTF8);

6、运行结果如下(outputPage.html文件的内容)。

自定义T4模板引擎

关于此方式,一般建议单独建立一个类库作为模板引擎使用。所以我们会建立一个单独的类库,在建立一个控制台项目进行演示。

自定义T4模板需要引用两个非常重要的类库。

  • Microsoft.VisualStudio.TextTemplating.10.0.dll
  • Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll

在类库中引用上面两个类库,并创建一个类,实现自定义的模板引擎。

public class CustomTextTemplatingEngineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost
{...
}

关于控制台项目,可按以下步骤进行。当然先看一下代码的结构会更好。

1、创建模板类,已完成T4模板中自定义的变量。

[Serializable]
public class Article
{public string Title { get; set; }public string Content { get; set; }
}
[Serializable]
public class MultiArticle
{public string Subject { get; set; }public List<Article> ArticleList { get; set; }public MultiArticle(string subject, List<Article> articles){Subject = subject; ArticleList = articles;}
}

这里的类不需要定义为部分类。

2、新建一个T4模板,内容如下。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".html" #>
<#@ import namespace="CustomTextConsole" #>
<#@ parameter type="CustomTextConsole.MultiArticle" name="entity" #><div style="text-align:center;"><table width="600" cellpadding="0" cellspacing="0" border="0" style="margin:0 auto;"><tbody><tr><td><div style="width:600px;text-align:left;font:12px/15px simsun;color:#000;background:#fff;"><!-- 水平居中的邮件 --><h1><#= entity.Subject #></h2><table><# foreach(Article item in entity.ArticleList){ #><tr><td> <#= item.Title #> </td><td> <#= item.Content #> </td></tr><# } #></table></div></td></tr></tbody></table>
</div>

模板中需要定义变量,甚至包括命名空间等的引用,具有根据实际项目而定。

3、在Mian方法中我们提供一个演示demo

CustomTextTemplatingEngineHost host = new CustomTextTemplatingEngineHost();//模板的位置可根据实际情况放置
var templatePath = Path.Combine(Environment.CurrentDirectory,"MultiArticle.tt");host.TemplateFile = templatePath;
string input = File.ReadAllText(templatePath);host.Session = new TextTemplatingSession();string subject = "最新消息";
var artList = new List<Article>();
for (int i = 0; i < 4; i++)
{Article art = new Article();art.Title = "标题" + i + ":" + Guid.NewGuid();art.Content = "内容" + i + ":" + Guid.NewGuid();artList.Add(art);
}MultiArticle mod = new MultiArticle(subject, artList);
host.Session.Add("entity", mod);
string output = new Engine().ProcessTemplate(input, host);File.WriteAllText(Path.Combine(Environment.CurrentDirectory,"test.html"), output);

基本的演示就这么多。这种方式个人觉得比较灵活,尤其是可以完成代码生成的相关代码生成工作。

4、结果和第一种方式的案例相同。

两种方式的比较

  • 灵活性来说,个人推荐第二种方式
  • 关于T4模板
    • 第一种方式的T4模板会自动生成一个.cs文件,就是靠这个文件才能生成最终的、我们需要的文件的。
    • 而第二种方式只有一个T4模板文件就可以了。

总结

以上就是关于T4模板的简单总结。希望对大家有所帮助。

.NET中关于T4模板的使用相关推荐

  1. MVC中使用T4模板

    一.原文地址 大佬的链接:http://www.cnblogs.com/heyuquan/archive/2012/07/26/2610959.html 二.图片释义 1.简单示例,对基本的模块标记 ...

  2. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)

    原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...

  3. C# T4模板在项目中的使用

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

  4. 创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]

    在<上篇>中我们通过T4模板为我们指定的数据表成功生成了我们需要的用于添加.修改和删除操作的存储过程.但是这是一种基于单个文件的解决方案,即我们必须为每一个生成的存储过程建立一个模板.如果 ...

  5. EF架构~为EF DbContext生成的实体添加注释(T4模板应用)

    相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回  EF架构~为EF DbConte ...

  6. [转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

    本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...

  7. T4模板使用记录,生成Model、Service、Repository

    自己目前在搭建一个.NET Core的框架,本来是打算使用前端做代码生成器直接生成到文件的,快做好了.感觉好像使用T4更方便一些,所以也就有了这篇文章~  我还是有个问题没解决,就是我想生成每个类(接 ...

  8. T4模板:MVC中用T4模板快速生成代码

    T4模板快速生成代码: 以快速生Dal文件为例,下面为T4模板文件的内容 <#@ template debug="false" hostspecific="true ...

  9. 你必须懂的 T4 模板:深入浅出

    示例代码:示例代码__你必须懂的T4模板:浅入深出.rar (一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文 ...

最新文章

  1. Java并发面试,幸亏有点道行,不然又被忽悠了
  2. mysql 触发器死循环_请教如何避免该条触发器的死循环
  3. 顶尖学者加盟!两所C9高校,获强援!
  4. 要不要读博?机器学习博五学生和强化学习博士展开了一场battle
  5. 换系统后mysql环境不见了_电脑重装系统后如何恢复Mysql数据库
  6. parents()和parent()
  7. tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
  8. OpenCV结合socket进行实时视频传输(TCP协议)
  9. [Vue 牛刀小试]:第八章 - 组件的基础知识
  10. SAP UI5 初学者教程之十九 - SAP UI5 数据类型和复杂的数据绑定
  11. python getopt.getopt_python 参数格式化getopt
  12. 怎么撤回操作_微信又更新,拍一拍能撤回了
  13. ejabberd源码学习——方法注册模式
  14. 从scheduler is shutted down看程序员的英文水平
  15. 电大计算机网络本作业1,2017年最新电大计算机网络作业1-3答案.doc
  16. padding和卷积的区别_NiN:使用11卷积层替代全连接层
  17. 职场“奇葩说”:我的老板有多坑?
  18. 机器学习资料与攻略超强整理吐血推荐(二)
  19. 叠片过滤器:全自动叠片盘式过滤器介绍
  20. 亲戚称呼计算机在线,亲戚称呼计算器

热门文章

  1. 打蚊子表情包_一拳超人:埼玉明显是动真格,蚊子为何能躲开埼玉的攻击?
  2. 大数据数据收集数据困难_工厂质量成本数据收集流程、方案
  3. python怎么切图片_Python切割图片成九宫格
  4. java康纳塔评测_JAVA性能、扩展对比
  5. centos上升级node_在centos7安装nodejs并升级nodejs到最新版本
  6. 元宵节电商促销首页设计PSD分层模板
  7. 设计素材导航网站,宝藏都在里面!
  8. 友好的免抠图片素材| PNG设计元素集海量来袭
  9. 平面设计师友好的免抠PNG图片素材
  10. idea抽取重复方法快捷键_使用 IDEA 几分钟就重构了同事800 行quot;又臭又长quot; 的类!真香!...