如何为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删掉,对应的类文件会自动删除;然后可以开始编写模板了,我这里先展示一个编写好的实体模板,然后再详细说明

 

代码
<#@ template language="C#v3.5" hostSpecific="true" debug="true" #>
<#@ 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(" """) #> { getset; }
        
        
<# } #>
        
    }
}

 

现在我为大家简单介绍一下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来生成代码

 

 

 

posted @ 2010-05-09 09:51  kalman  阅读(2764)  评论(5编辑  收藏