最近想在项目中使用一个代码生成器,用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#>>
{
}
}
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;
}
}
}
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
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,存储过程等