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));
}
#>
 

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();
}
}
#>
 

T4 反射实体模型生成代码(Demo)的更多相关文章

  1. 让T4脱离VS生成代码

    让T4脱离VS生成代码 最近项目快结束:空闲时间相对多一点:为了以后工作方便点:索性研究了VS的T4: 写个代码生成器:以后可以通过代码生成器调用项目里面的Dll直接生成代码或者xml: 应用以下两个 ...

  2. 【转】- 使用T4模板批量生成代码

    前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...

  3. T4模板批量生成代码

    大家通过比对下,就应该知道怎么玩. T4代码 <#@ template debug="false" hostspecific="true" languag ...

  4. T4模板批量生成代码文件

    <#@ template debug="false" hostspecific="true" language="C#" #> ...

  5. T4模板根据数据库表和列的Description生成代码的summary的终极解决方案

    相信很多人都用T4模版生成代码,用T4模版生成标准代码真的很方便.我们经常根据表生成相关的代码, 但是估计很多人都遇见过同一个问题, 特别是我们在生成model的时候,代码中model中的Summar ...

  6. [golang]反射的用处--代码自动生成

    背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct ...

  7. 使用 T4 文本模板生成设计时代码

      使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...

  8. C# 通过T4自动生成代码

    通过T4模板生成代码,运行时实现 关键代码段:Host using Microsoft.VisualStudio.TextTemplating; using System; using System. ...

  9. T4模板生成代码。 数据实体层与数据仓储层。备注

    文件生成模板:TempleteManager.ttinclude <#@ assembly name="System.Core" #><#@ assembly n ...

随机推荐

  1. Vue 获得所选中目标的状态(checked)以及对应目标的数据,并进行相应的操作

    一.我们现在要拿取购物车中选中商品的状态和该商品的所有数据或者id <ul v-if="shopList.list.length>0"> <li class ...

  2. java学习之—数组的曾删改查

    /** * 数组的曾删改查 * Create by Administrator * 2018/6/8 0008 * 上午 9:54 **/ public class HighArray { priva ...

  3. python设计模式第二十三天【状态模式】

    1.应用场景 (1)通过改变对象的内部状态从而改变对象的行为,一般表现为状态的顺序执行 2.代码实现 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from ...

  4. MySQL 索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  5. C语言实现字符串逆序输出

    方法一: #include <stdio.h> #include <stdlib.h> #include <string.h> void Reverse(char ...

  6. Go语言变量和常量

    一.变量相关 1.变量声明 C# : int a; Go : var a int; 需要在前面加一个var关键字,后面定义类型 可以使用 var( a int; b string;)减少var 2.变 ...

  7. nginx-添加禁止访问规则

    location ~* /application/(admin|index)/static/.*$ { allow all; } location ~* /(applicaion|addos|coe| ...

  8. Codeforces Round #433 Div. 1

    A:显然从大到小排序后贪心放在第一个能放的位置即可.并查集维护. #include<iostream> #include<cstdio> #include<cmath&g ...

  9. LSM

    1.MySQL存储引擎: B+树 https://blog.csdn.net/qq_26222859/article/details/80631121 2.HBase LSM树 核心:将对数据的修改增 ...

  10. 接口压测初识java GC

    1.先用Spring Boot 搭建 web 服务,构建api 服务 @RequestMapping("/index") @ResponseBody public String i ...