3.代码生成器编写

代码 · 浏览次数 : 3

小编点评

**代码生成器** 代码生成器是生成C#代码的工具,可以使用文本模板或运行时模板来生成代码。 **文本模板** 文本模板是一种包含文件在.tt文件中的包含文件。 **运行时模板** 运行时模板是一种将模板中的内容包含到运行时代码中的代码。 **代码生成器的语法** * <#…#>:用于注释。 * <#+……>:用于嵌套使用。 * <#…#>:用于多个方法或语句的合并。 **示例代码** ```ttinclude ProjectDir相当于模板所在的根路径,模板文件里特用的 <#@ include file=\"$(ProjectDir)GeneratingClass.ttinclude\"#> ``` **使用代码生成器** 1. 创建一个.tt文件。 2. 在模板中包含.ttinclude文件。 3. 使用代码生成器生成代码。 4. 将生成的代码保存为.cs文件。 **注意** * 代码生成器仅支持文本模板。 * 代码生成器没有智能提示或格式化。 * 代码生成器不能用于生成复杂类型或继承的代码。

正文

正如上篇文章所说,一般仓储模式,每张表都至少有4个类。仓储接口、实现类,服务接口实现类。假设你有N张表,如果凭借手动新建,那可真是离腱鞘炎不远了……

SO~我在这篇文章主要写一下代码生成器。

其实好早之前就知道这个东西,也见过网上很多开源的代码生成器,如果觉得麻烦,懒得自己做,其实可以跳过这篇文章了。在网上找一个自己配置下就行了,这玩意儿说难不难,说简单也不是很简单,可能会涉及一些偏向底层的接口什么的,当然啦,你如果使用一些工具,插件或者开源的代码生成器,那就不需要担心了,可能稍微配置一下就好了,我没有去研究过那些开源的,所以我就不多说什么了,可以自己去找一下。

我使用的是微软的T4模板。毕竟这是个Net项目嘛,而且相对来说C#代码还是容易看得懂的,只是一些比较冷门,比较偏底层的接口实在是难搞,微软文档太难找了……

在这个项目开始之前我压根不会代码生成,我不想最后写着写着搞得很麻烦,所以熬夜学了几天,可能理论上的细节上的我目前没法给你将的很明白。我在搜罗相关博客的时候发现关于T4模板的都很早了(集中在12年-16年),没怎么细看,因为一眼看过去和官方文档差不多,所以最好的老师还是官方文档

正文部分开始:

先丢一个创建.tt文件的默认内容:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>

简单先说一下T4模板里的两种不同模板:一种是文本模板(TextTemplatingFileGenerator),一种是运行时模板(TextTemplatingFilePreprocessor)。

用到的是文本模板,运行时模板我没怎么看,写法也差不多,但文本模板已经够用了,我也害怕太久不更新我自己就懈怠了,忘记了,所以这几天熬夜都到四五点…我哭死……

你在vs新建项的时候搜索模板,就会搜索到对应的文件类型了。他们的文件名扩展为 .tt

还有一个扩展名为 .ttinclude的一种文件。这个你新建一个txt就行,修改后缀名就得了,好像没法直接添加。官方话语太官方,我当时没怎么理解,现在写博客的时候算是温故而知新吧。那我的理解就很简单了,这种类型的文件是作为包含文件在.tt文件中使用的。就相当于你写代码,调用其他类里的方法一样。

写法大概是:

假设我有这么一个文件 text.ttinclude。

在.tt文件中包含此文件:ProjectDir相当于模板所在的根路径,模板文件里特用的(大概是,我也是第一次在这里使用)

<#@ include file="$(ProjectDir)GeneratingClass.ttinclude"#>  

接下来就是T4中的一些语法

 按照顺序来说

  1. <#……#>: 这个可以在里面写c#语法 但不能嵌套使用,例如:foreach并未结束,但是我要在模板添加内容就不得不给个结尾,然后在使用新的<#……#>继续编写

     

  2. <#+……> 这个可以在里面写完整的c#方法,我目前一般都是在.ttinclude文件中使用,封装成方法去使用,T4模板没有智能指令,就是文本文字,所以写在ttinclude中看着比较舒服,当然.tt文件中也可以使用,效果一样的。类似这样,这个回头可以直接找我代码看吧,连个折叠都没有,也没法颜色区分,我是参考了网上的代码改写的,相对来说简单点,没有特别复杂的

  3. <#=……#>这个比较简单了。你在上面两个指令里写的c#语法,里面的变量参数,可以使用这个去获取。例如:

  4. 剩下两个 import 可以理解为using(当然它不止如此),引入命名空间的。include则是在.tt文件中引入.ttinclude文件的。写法大致如下
    <#@ import namespace="System.IO" #>
    <#@ include file="$(ProjectDir)DbHelper.ttinclude"#>

到这里,基础的玩意儿都已经讲差不多了,T4模板写起来语法没什么,就是没有格式化,没有智能提示,甚至没有颜色区分。完全可以当成txt来看待。我是使用了两个插件,所以我截图里面有颜色,不然我真的搞不下去,能看瞎……

回头俺这个要是关注人多了,可以来录视频讲解下。

虽然这篇文章好像啥也没写吧,其实主要是代码部分,他不是.cs文件那种,层次分明的,连个折叠都没有,我有点难搞,so~你们直接来看代码好了,我会上传git,我写的还可以吧hhhh,我尽量按照标准的代码格式去写了,不至于睁眼瞎~找个少的给你们大致看眼代码(截图,因为上传代码块会错位很多,理解起来效果不好,可以去git来下载,顺便点个关注star)

最后的最后!演示下效果:

还是上次建好的项目,现在他是啥也没有:

 然后我启动代码生成功能,得到的效果如下:根据数据库表结构已经全部自动生成完毕

 打开会提示找不到类型,这里的话我打算通过Sqlsugar生成,目前还没生成表实体,所以找不到这个表,正常。重点在于代码生成!成功完成!

 

 

今天能早点睡吗…别再失眠了… 结束,掰掰……

 

与3.代码生成器编写相似的内容:

3.代码生成器编写

正如上篇文章所说,一般仓储模式,每张表都至少有4个类。仓储接口、实现类,服务接口实现类。假设你有N张表,如果凭借手动新建,那可真是离腱鞘炎不远了…… SO~我在这篇文章主要写一下代码生成器。 其实好早之前就知道这个东西,也见过网上很多开源的代码生成器,如果觉得麻烦,懒得自己做,其实可以跳过这篇文章了

Mybatiplus通用3.5.1版本及其以上的代码生成器工具类

Mybatiplus通用3.5.1版本及其以上的代码生成器工具类 package com.gton.util; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotati

如何3分钟,快速开发一个新功能

背景 关于为什么做这个代码生成器,其实主要有两点: 参与的项目中有很多分析报表需要展示给业务部门,公司使用的商用产品,或多或少有些问题,这部分可能是历史选型导致的,这里撇开不不谈;项目里面也有很多CRUD的功能,而这些功能的实现代码基本上差不多,这些功能都去手写,也比较浪费时间而且效率很低,还可能会

Seal AppManager v0.2 发布:进一步简化应用部署体验

经过近3个月的研发,Seal AppManager v0.2 已正式发布。 Seal AppManager 是一款基于平台工程理念的应用统一部署管理平台,于今年4月首次推出。在上一版本中,我们已经释出**集成 ChatGPT 简化服务模板代码生成、云成本可视化、动态环境管理**等功能,通过降低基础设

.NET周报 【5月第2期 2023-05-14】

国内文章 XUnit数据共享与并行测试 https://www.cnblogs.com/podolski/p/17388602.html 在单元或者集成测试的过程中,需要测试的用例非常多,如果测试是一条一条过,那么需要花费不少的时间。从 V2 开始,默认情况下 XUnit 自动配置并行(参考资料),

1.创建一个类,类A中定义了一个方法,该方法能接受3个参数根据参数判断是做加法还是减法并返回计算结果;

class A: def cal(self,x,y,z): if z=='+': return x+y if z=='-': return x-y else: print('error') a=A() b=a.cal(3,4,'+') print(b) 运行结果: 2.延伸:创建一个类,类B继承A类

umich cv-3-1

UMICH CV Neural Network 对于传统的线性分类器,分类效果并不好,所以这节引入了一个两层的神经网络,来帮助我们进行图像分类 可以看出它的结构十分简单,x作为输入层,经过max(0,W1*x)到达h隐藏层,再经过W2到达s输出层 如果我们对隐藏层的结果进行可视化,我们可以看到如下的

NebulaGraph实战:3-信息抽取构建知识图谱

自动信息抽取发展了几十年,虽然模型很多,但是泛化能力很难用满意来形容,直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核,但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练,然后来实体抽取、实体属性抽取、实体关系抽取、事件抽取、实体链接和指代消解等等。现在

3.你所不知道的go语言控制语句——Leetcode习题69

[TOC] # 本篇前瞻 好的,现在你已经来到一个新的小结,在这里你将学习到go语言的重要内容,习得go 25个关键字中的12个:var, const, if, else, switch, case, default, fallthrough, for, break, goto, continue,

(3) MasaFramework 入门第三篇,使用MasaFramework

首先我们需要创建一个MasaFramework模板的项目,项目名称TokenDemo,项目类型如图所示 删除Web/TokenDemo.Admin项目,新建Masa Blazor Pro项目模板 项目,项目位置在src/Web项目 项目类型选择ServerAndWasm,为了让我们支持俩种模式 创建