.NET中关于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模板的简单总结。希望对大家有所帮助。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客,请把作业链接贴在评论区,老师会定期逐个批改~~)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值