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)的更多相关文章
-
让T4脱离VS生成代码
让T4脱离VS生成代码 最近项目快结束:空闲时间相对多一点:为了以后工作方便点:索性研究了VS的T4: 写个代码生成器:以后可以通过代码生成器调用项目里面的Dll直接生成代码或者xml: 应用以下两个 ...
-
【转】- 使用T4模板批量生成代码
前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...
-
T4模板批量生成代码
大家通过比对下,就应该知道怎么玩. T4代码 <#@ template debug="false" hostspecific="true" languag ...
-
T4模板批量生成代码文件
<#@ template debug="false" hostspecific="true" language="C#" #> ...
-
T4模板根据数据库表和列的Description生成代码的summary的终极解决方案
相信很多人都用T4模版生成代码,用T4模版生成标准代码真的很方便.我们经常根据表生成相关的代码, 但是估计很多人都遇见过同一个问题, 特别是我们在生成model的时候,代码中model中的Summar ...
-
[golang]反射的用处--代码自动生成
背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct ...
-
使用 T4 文本模板生成设计时代码
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...
-
C# 通过T4自动生成代码
通过T4模板生成代码,运行时实现 关键代码段:Host using Microsoft.VisualStudio.TextTemplating; using System; using System. ...
-
T4模板生成代码。 数据实体层与数据仓储层。备注
文件生成模板:TempleteManager.ttinclude <#@ assembly name="System.Core" #><#@ assembly n ...
随机推荐
-
java并发编程(十五)内存可见两种方式 加锁和volatile
1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制. ...
-
MODI与VB6
作者:马健邮箱:stronghorse_mj@hotmail.com主页:http://www.comicer.com/stronghorse发布:2016.12.16 在我写的<用MODI O ...
-
SQL查询中in、exists、not in、not exists的用法与区别
1.in和exists in是把外表和内表作hash(字典集合)连接,而exists是对外表作循环,每次循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的,如果查询的两个表大小 ...
-
[置顶] JQuery插件学习教程
这是JQuery其它常用插件的视频教程,包括validate插件,.comet插件等.同时有大量实例项目,如果你是喜欢JQuery的童鞋千万不要错过. 教程的内容有: 1_validate插件(1) ...
-
Git(Repo)常用命令收集
(注意: 只记录工作中实际使用的命令) 同步android源码 repo sync:(可加-c,只取当前分支: 可加-j4,线程数量) 查看android源码下所有项目的git状态 rep ...
-
Java编码浅析(注意区分三个概念)(转)
编码: (1)外部资源的字符集-----没有读入jvm中的数据都是外部资源 (2)jvm中数据的字符集-----都是unicode (1)和(2)之间发生交互时,如果不指定编码,则使用JVM平台默认字 ...
-
iOS开发The Operation couldn&#39;t be completed.(LaunchServicesError error 0.)的解决方法
显示错误:The Operation couldn't be completed.(LaunchServicesError error 0.)解决办法:第1种方法.点击当前的模拟器,点击IOS Sim ...
-
[转]the service mysql57 failed the most recent status[/br]mysql57 was not found解决办法
转自:http://forums.mysql.com/read.php?169,622722,622877#msg-622877 安装完mysql5.7.12后想要stop或者restart都会出现以 ...
-
斐波那契数列 (C#)
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...
-
11.2-uC/OS-III添加任务到就绪队列
1.uC/OS-III提供很多服务可以把任务添加到就绪列表中. 最明显的服务是OSTaskCreate(), 它通常创建准备运行的任务并将任务放入就绪列表中.如图6-6所示,就绪列表中该优先级中已经有 ...