博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC 之 T4模板简介
阅读量:6239 次
发布时间:2019-06-22

本文共 3688 字,大约阅读时间需要 12 分钟。

个人网站地址:

一、T4模板内容简介

为了更好地学习T4模板,我们安装一个插件 在使用了EF生成实体类后,我们会发现一个.tt后缀的文件,它就是T4模板,直接打开 它的内容如下图:

就是这一个模板,生成了我们需要的类,省去了我们手写的麻烦,提高了工作效率,生成的实体类如下图:

那么,这些类是如何用T4模板生成出来的?要自定义模板又该如何操作?

下面来简单介绍下T4模板中的核心代码

1、全局变量申明

<#@ template language="C#" debug="false" hostspecific="true"#> //模板指令集 告诉编辑器这是一个模板 用C#语言,<#@ include file="EF.Utility.CS.ttinclude"#>  //导入外部的模板<#@ output extension=".cs"#>  //输出扩展名为.cs的文件

上面段代码就是定义要用到的全局变量(如 要映射类的EDMX文件、引用名称空间、实体类集合等...)

2、生成类顶部注释、实体类名称空间 及 实体类名称和后缀名

WriteHeader(codeStringGenerator, fileManager);//生成类中的最顶部注释foreach (var entity in typeMapper.GetItemsToGenerate
(itemCollection)){ fileManager.StartNewFile(entity.Name + ".cs");//生成类名称以及加.cs后缀名称 BeginNamespace(code);//生成类名称空间 ...}

这句代码生成的相应类文件如下图

3、引用空间名称 UsingDirectives 方法

public string UsingDirectives(bool inHeader, bool includeCollections = true)    {        return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())            ? string.Format(                CultureInfo.InvariantCulture,                "{0}using System;{1}" +                "{2}",                inHeader ? Environment.NewLine : "",                includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",                inHeader ? "" : Environment.NewLine)            : "";    }

默认引用了System和System.Collections.Generic,如下图:

4、定义类名 EntityClassOpening方法

public string EntityClassOpening(EntityType entity)    {        return string.Format(            CultureInfo.InvariantCulture,            "{0} {1}partial class {2}{3}",            Accessibility.ForType(entity),            _code.SpaceAfter(_code.AbstractOption(entity)),            _code.Escape(entity),            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));    }

Accessibility.ForType(entity) 访问修饰符,_code.Escape(entity) 类名称 ,如下图:

5、生成字段属性 Property方法

public string Property(EdmProperty edmProperty)    {        return string.Format(            CultureInfo.InvariantCulture,            "{0} {1} {2} {
{ {3}get; {4}set; }}", Accessibility.ForProperty(edmProperty), _typeMapper.GetTypeName(edmProperty.TypeUsage), _code.Escape(edmProperty), _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); }

Accessibility.ForProperty(edmProperty) 访问修饰符, _typeMapper.GetTypeName(edmProperty.TypeUsage) 字段数据类型,如下图:

二、T4模板拓展 继承基类、接口

一般我们在基类中定义一些通用的方法,让子类直接继承使用,先定义如下基类:

public class IEntity
where T : class , new() { private DbContext db { get { return EFDbContextFactory.GetCurrentDbContext(); } } ///
/// 根据条件查找 /// ///
///
public T Find(Expression
> where = null) { if (where == null) return db.Set
().FirstOrDefault(); else return db.Set
().Where(where).FirstOrDefault(); } }

直接修改T4模板中的 定义类名 EntityClassOpening 方法,继承基类的Find方法,修改后的代码如下:

public string EntityClassOpening(EntityType entity)    {        return string.Format(            CultureInfo.InvariantCulture,            "{0} {1}partial class {2}{3} : IEntity<{2}>",            Accessibility.ForType(entity),            _code.SpaceAfter(_code.AbstractOption(entity)),            _code.Escape(entity),            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));    }

然后直接保存一下,再查看T4模板生成的类,发现它们都自动继承了IEntity类,如下图

调用 ,直接B_Article model = new B_Article().Find(c => c.UserName == "tess");

转载于:https://www.cnblogs.com/nee32/p/5672589.html

你可能感兴趣的文章
nrm切换npm源利器
查看>>
[C编程在Linux上]用 printf做彩色日志记录
查看>>
O365结合ADFS限制用户登录地址 (二) - 安装AAD Connect
查看>>
Lync 2013 配合 Sonus SBC 1000/2000 配置呼叫转接和同时拨打
查看>>
工作流引擎Synchro Flow的流程度量
查看>>
asp.net 使用ffmpeg.exe获取视频信息并截图方法类
查看>>
Go36-31-sync.WaitGroup和sync.Once
查看>>
input设置为disabled提交后获取不到该值的解决方法
查看>>
我的友情链接
查看>>
利用wget 和队列 模拟网络爬虫 (不带判重程序)
查看>>
从零开始学习Gradle之三---多项目构建
查看>>
年轻人的自我自救:你有没有勇气输得起?
查看>>
cisco *** client 自动重拨
查看>>
1218直播节,花椒与北京卫视会密谋什么新局?
查看>>
Android 调用手机自带的下载器下载
查看>>
我的友情链接
查看>>
阿里巴巴的微服务开源之路
查看>>
思科交换机 flow control 交换机流控
查看>>
中国联通与阿里云达成合作,推动5G+新媒体产业发展
查看>>
项目风险应对策略总结
查看>>