• T4 反射实体模型生成代码(Demo)


    1.新建一个T4 Script

    <#@ template language="C#" debug="True" #>
    <#@ output extension="cs" #>
    <#@ Assembly Name="System.Core" #>
    <#@ Assembly Name="$(SolutionDir)Demo.ToolsinDebugDemo.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.T4GeneratorT4"));
        //输入文件路径
        string outputPath = Path.Combine(solutionPath, @"MvcApplication1Models");
        //输出项目路径
        string targetProject = Path.Combine(solutionPath, @"MvcApplication1MvcApplication1.csproj");
        //包含实体定义的DLL所在位置
        string modelFile= Path.Combine(solutionPath, @"Demo.EntitysinDebugDemo.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));
        }
    #>

    2、新建T4 Template,这里是具体的模板

    <#+
    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框架

  • 相关阅读:
    简单缓存 datatable
    发现一句实话
    今天一个比较感兴趣的心里测试
    innodb与myisam的对比总结
    插入数据的优化
    PHP 实现事务处理
    mysql 优化的整体思路
    301跳转
    jquery显示div的方法
    <c:forEach 的常用整理
  • 原文地址:https://www.cnblogs.com/blackice/p/5531873.html
Copyright © 2020-2023  润新知