代码改变世界

用T4模板实现简单的代码生成器

2012-04-03 13:04  Wings dark  阅读(1121)  评论(1编辑  收藏  举报

最近想在项目中使用一个代码生成器,用T4模板实现了,还是蛮方便的。关于T4模板的介绍可以看下园中相关系列文章T4的介绍创建运行时模板。里面介绍蛮详细的。

代码生成器界面如下,比较简单,我这里是通过传入实体类名称生成对应层的代码:

 

 

 

添加预处理的模板 IDal.tt(其他类似),代码如下:

View Code
<#@ template language="C#" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;

namespace IDal
{
    public interface I<#=ClassNames#>Dal : IRepository<<#=ClassNames#>>
    {
    
    }
}

 同时新建一个IDal的部分类:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CodeBuilder.Template
{
    public partial class IDal
    {
        public string ClassNames
        {
            get;
            set;
        }

        public IDal(string _ClassNames)
        {
            this.ClassNames = _ClassNames;
        }
    }
}

 default.aspx.cs主要代码:

View Code
#region 通过反射取得要生成的类
                        Assembly ass = Assembly.Load("Template"); //获取程序集
                        Type myclass = null;
                        MethodInfo mymethod = null;
                        foreach (var name in list)
                        {
                            foreach (ListItem item in chkboxType.Items)
                            {
                                if (item.Selected)
                                {
                                    Type[] mytypes = ass.GetTypes();
                                    foreach (Type t in mytypes)
                                    {
                                        if (t.Name == item.Text)
                                        {
                                            myclass = t;
                                            break;
                                        }
                                    }
                                    Object obj = Activator.CreateInstance(myclass, name);
                                    mymethod = myclass.GetMethod("TransformText"); //取TransformText()函数
                                    String pageContent = mymethod.Invoke(obj, null).ToString();
                                    //创建文件
                                    File.AppendAllText(dirpath + @"\" + string.Format(item.Value, name) + ".cs", pageContent);
                                }
                            }
                        }
                        #endregion 

 

#region

 这里通过反射查找所有要生成的模板文件并创建文件,通过myclass.GetMethod("TransformText")调用TransformText方法,取得要生成的文件中内容。

代码中的下载和压缩用到了园子中的工具类 http://www.cnblogs.com/zjyuan/archive/2011/11/06/2237883.html

 

 我这里生成的代码主要是为了符合自己项目的需要,实际使用中可以根据需要扩展如通过数据库表生成model,存储过程等