如何为Kalman Studio编写T4模板
昨天刚发布了Kalman Studio代码生成器,有人说T4模板不大会编写,其实很简单,会C#语法就会编写,我这里简单的介绍一下
首先,打开Visual Studio,新建一个文本文件,将扩展名改为"tt"
这时Visual Studio会为Entity.tt生成一个对应的类文件Entity.cs,这时因为Visual Studio内置了一个代码生成工具TextTemplatingFileGenerator,会自动为每个模板文件生成对应的类文件,如果你在Entity.tt中编辑好模板,然后打开Entity.cs,TextTemplatingFileGenerator会自动解析模板,将代码输出到文件Entity.cs
我们这里不需要使用TextTemplatingFileGenerator生成代码,把属性面板,自定义工具里面的文字TextTemplatingFileGenerator删掉,对应的类文件会自动删除;然后可以开始编写模板了,我这里先展示一个编写好的实体模板,然后再详细说明
<#@ output extension=".cs" #>
<#
TableHost host = (TableHost)(Host);
SOTable table = host.Table;
List<SOColumn> list = host.ColumnList;
string columnPrefix = host.GetString("ColumnPrefix");
int prefixLevel = host.GetInt32("PrefixLevel");
string nameSpace = host.GetString("NameSpace");
string className = host.GetString("ClassName");
if(string.IsNullOrEmpty(nameSpace))nameSpace = "Entity";
if(string.IsNullOrEmpty(className))className = table.Name;
#>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace <#= nameSpace #>
{
/// <summary>
/// <#= table.Comment == "" ? table.Name : table.Comment #>
/// </summary>
[Serializable]
public partial class <#= className #>
{
<# foreach (SOColumn c in list)
{ #>/// <summary>
/// <#= c.Comment == "" ? c.Name : c.Comment #>
/// </summary>
public <#= TypeUtil.DbType2TypeString(c.DataType) #> <#= StringUtil.RemovePrefix(c.Name, columnPrefix, prefixLevel).Replace(" ", "") #> { get; set; }
<# } #>
}
}
现在我为大家简单介绍一下T4模板语法
<#@ template language="C#v3.5" hostSpecific="true" debug="true" #>
这里可以指定模板使用的语言,hostSpecific="true"表示是否使用特定的host(Kalman Studio里面使用的是TableHost对象,必须实现接口ITextTemplatingEngineHost)
<#@ output extension=".cs" #> 指定生成文件的扩展名
<#@ assembly name="System.Data" #>
添加程序集引用,如果要使用第三方程序集,那么最好在项目中添加引用,或者加入到GAC
<#@ import namespace="System.Data" #>
导入要使用的命名空间,注意:这里的命名空间必须要在前面指定的程序集里面找得到的,比如我指定命名空间"System.Data","System.Data.Common",这些在程序集System.Data中都有的
<#@ include file="test.tt" #> 导入模板,类似Html的include用法
<# #> 定义代码块
<#= #> 定义表达式
<#+ #> 定义变量
我觉得讲了这些大家应该可以很轻松的编写T4模板了,下次再为大家讲解如何实现一个自定义的TextTemplatingEngineHost来生成代码