T4模板 生成代码
在开发过程中 我经常出现写重复代码的情况 比如说增删改查,然后看ABP框架的时候看到代码生成器 发现代码生成器居然这么强大居然还可以生成增删改查和HTML这些代码,话不多说 能让你少写点代码的东西 何乐而不为呢
由于博主没有怎么写过博客园的文档 样式可能有点丑 还望各位包涵 由于本人对T4还没有研究透彻 说的不好的地方还望各位海涵
新建项 新建T4文本文档 如下
完成后生成以下代码
解释:
-
T4模板指令:该指令指定应如何处理模板
<#@ template debug="false" hostspecific="false" language="C#" #>
指令:<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>
更多解释:https://msdn.microsoft.com/zh-cn/library/gg586945.aspx
-
T4程序集指令:指令可加载程序集,以便您的模板代码可使用其类型。
<#@ assembly name="System.Core" #>
指令:<#@ assembly name="[assembly strong name|assembly file name]" #>
更多解释:https://msdn.microsoft.com/zh-cn/library/gg586946.aspx
-
T4导入指令:指令允许您在不提供完全限定名称的情况下引用另一个命名空间中的元素
<#@ import namespace="System.Linq" #>
指令:<#@ import namespace="namespace" #>
更多解释:https://msdn.microsoft.com/zh-cn/library/gg586948.aspx
-
T4输出指令:用于定义已转换文件的文件扩展名和编码
<#@ output extension=".txt" #>
指令:<#@ output extension=".fileNameExtension" [encoding="encoding"] #>
更多解释:https://msdn.microsoft.com/zh-cn/library/gg586943.aspx
在这里我们还需要一个指令 用该指令将我们添加的运行时文本模板导入进来
T4包含指令:通过使用 <#@include#> 指令可包括来自另一个文件的文本
<#@ include file="T4Toolbox.tt" #>
指令:<#@ include file="filePath" #>
更多解释:https://msdn.microsoft.com/zh-cn/library/gg586949.aspx
添加运行时文本模板 (创建该模板的是我们生成的类文件的模型)
创建成功后的属性
但是我们不需要自定义工具这项 直接删除
这样这个模板就没有下拉这个了
现在为创建一个模型在这个模板里面 代码如下:
<#+ public class BLLTemplate : CSharpTemplate { string name; public BLLTemplate(string modelName) { name = modelName; } /// <summary> /// 获取 生成的文件名,根据模型名定义 /// </summary> public string FileName { get { return string.Format("{0}BLL.cs", EntityName); } } /// <summary> /// 实体名称 /// </summary> public string EntityName { get { return name.Replace("Model", string.Empty); } } public override string TransformText() { base.TransformText(); #> //------------------------------------------------------------------------------ // <auto-generated> // 此代码由工具生成。 // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // 提示:如存在本生成代码外的新需求,请在相同命名空间下创建同名分部类实现分部方法。 // </auto-generated> //------------------------------------------------------------------------------ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test.BLL { /// <summary> /// 逻辑层 /// </summary> public partial class TestBLL { } } <#+ return this.GenerationEnvironment.ToString(); } } #>
现在bll模型已经创建成功现在回到最开始创建的文本模板TextTemplate2.tt里面
插入以下代码
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ Import Namespace="System.IO" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Reflection" #> <#@ Import Namespace="System.Collections.Generic" #> <#@ output extension=".txt" #> //这个必填 导入T4工具 <#@ include file="T4Toolbox.tt" #> //这里填写bll模型的路径 当前TextTemplate2.tt目录下的Template文件夹里的BLLTemplate1.tt <#@ include file="Template/BLLTemplate1.tt" #> <# //当前TextTemplate2.tt所在的模板路径
//Host.Template 是当前文本模板TextTemplate2.tt的路径 var currentPath = Path.GetDirectoryName(Host.TemplateFile); //解决方案路径 string solutionPath = currentPath.Substring(0, currentPath.LastIndexOf("\\")); //项目名称 string projectFullName = currentPath.Substring(currentPath.LastIndexOf("\\") + 1); string model= "TestModel"; //实例化bll模板 BLLTemplate bll= new BLLTemplate(model); string filePath= Path.Combine(currentPath,"bll", bll.FileName); //创建文件 bll.RenderToFile(filePath); #>
然后保存生成了文件
由于本人对这个基本概念也不是很了解 所以大家不懂得可以多参考资料 我这里只是实现
参考:
文本模板控制块:https://msdn.microsoft.com/zh-cn/library/bb126545.aspx
文档:https://msdn.microsoft.com/zh-cn/library/bb126445.aspx
入门:http://www.cnblogs.com/heyuquan/archive/2012/07/26/2610959.html