T4 反射實體模型生成代碼(Demo)

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框架工具

相關文章
相關標籤/搜索