1.新建一個T4 Script框架
<#@ template language="C#" debug="True" #> <#@ output extension="cs" #> <#@ Assembly Name="System.Core" #> <#@ Assembly Name="$(SolutionDir)Demo.Tools\bin\Debug\Demo.Tools.dll" #> <#@ import namespace="System.IO" #> <#@ Import Namespace="System.Linq" #> <#@ Import Namespace="System.Text" #> <#@ import namespace="System.Reflection" #> <#@ Import Namespace="System.Collections.Generic" #> <#@ Import Namespace="Demo.Tools" #> <#@ include file="T4Toolbox.tt" #> <#@ include file="EntityTemplate.tt" #> <# //腳本運行路徑 string currentPath = Path.GetDirectoryName(Host.TemplateFile); //解決方案路徑 string solutionPath = currentPath.Substring(0, currentPath.IndexOf(@"\Demo.T4Generator\T4")); //輸入文件路徑 string outputPath = Path.Combine(solutionPath, @"MvcApplication1\Models"); //輸出項目路徑 string targetProject = Path.Combine(solutionPath, @"MvcApplication1\MvcApplication1.csproj"); //包含實體定義的DLL所在位置 string modelFile= Path.Combine(solutionPath, @"Demo.Entitys\bin\Debug\Demo.Entitys.dll"); //加載實體程序集 byte[] fileData= File.ReadAllBytes(modelFile); Assembly assembly = Assembly.Load(fileData); //反射出全部繼承了Entity的實體類 IEnumerable<Type> modelTypes = assembly.GetTypes().Where(m => typeof(Demo.Tools.Entity).IsAssignableFrom(m) && !m.IsAbstract); foreach(Type modelType in modelTypes) { T4ModelInfo model = new T4ModelInfo(modelType); //實體模板 EntityConfigurationTemplate config = new EntityConfigurationTemplate(model); //輸出的文件編碼 config.Output.Encoding = Encoding.UTF8; //定製輸出項目 config.Output.Project = targetProject; //輸出生成的文件 config.RenderToFile(Path.Combine(outputPath, config.FileName)); } #>
二、新建T4 Template,這裏是具體的模板ide
<#+ public class EntityConfigurationTemplate : CSharpTemplate { private T4ModelInfo _model; public EntityConfigurationTemplate(T4ModelInfo model) { _model = model; } /// <summary> /// 獲取 生成的文件名,根據模型名定義 /// </summary> public string FileName { get { return string.Format("{0}.generated.cs", _model.Name); } } public override string TransformText() { #> //------------------------------------------------------------------------------ // <auto-generated> // 此代碼由工具生成。 // 對此文件的更改可能會致使不正確的行爲,而且若是 // 從新生成代碼,這些更改將會丟失。 // </auto-generated> // // <copyright file="<#= _model.Name #>.generated.cs"> // 生成時間:<#= DateTime.Now.ToString("yyyy-MM-dd HH:mm") #> // </copyright> //------------------------------------------------------------------------------ using System; using System.Data; using Demo.Entitys; namespace MvcApplication1.Models { /// <summary> /// <#= _model.Description #> /// </summary> internal partial class <#= _model.Name #> { /// <summary> /// <#= _model.Description #> /// </summary> public <#= _model.Name #>() { <#= _model.Name #>(); } } } <#+ return this.GenerationEnvironment.ToString(); } } #>
PS:以上模板扒自郭明鋒的GMF框架工具