使用C#编写自己的代码生成器,附代码讲解(一)
使用过代码生成器的开发人员应该知道,通过代码生成器生成项目的代码,可以大大的减少重复编码的时间,提供项目开发的效率,将自己从繁杂重复的代码中解放出来。现在网络上也有很多的开源的代码生成器或者使用比较广泛的代码生成器,如动软代码生成器相信不少开发人员使用过。有时候在线的代码生成器生成的代码未必百分之百符合我们的心意,符合项目的需要,此时我们可以考虑自己使用C#编写一套自己的代码生成器软件,可以按照自己指定的规则生成相应的代码文件以及目录。博主在工作过程中接触以及开发过2类代码生成器,一类是WinForm窗体程序的代码生成器,开发者可以安装到自己的电脑上。另一类是Web版本的代码生成器,整个生成器的界面是个HTML网页,可以单独部署成一个网站站点,Web代码生成器有个优点就是你不需要在自己电脑上安装软件,只要电脑能联网,即可通过浏览器访问到代码生成器页面进行操作。
首先来阐述下代码生成器制作的几个大的步骤流程:
(1)分析项目代码结构:此步比较关键,是制作开发过程中最基础的部分。通过分析项目代码的结构,得出每个类的共同点或者相似点,这些共同点和相似点即可抽象出来作为一个定式。如分析实体类Model结构、DAL数据层结构以及含有的公用类似方法、BLL业务逻辑层的结构以及公用类似方法、View数据展示层相同类似代码等。
举个例子:假设你项目代码中的实体类Model的结构都是如下这种,那你在生成实体类的.CS类文件就得按下面方式的方式生成一个私有字段,然后对应一个共有属性的方式。在DAL层和BLL层的代码类似,如DAL层必须含有一个根据主键Id的查询函数,则你在生成实体类对应DAL层的时候自动生成该查询函数。
Public class Teacher
{
Private string _Name;
Public string Name
{
get { return _Name}
set {_Name=value;}
}
}
(2)设计项目实体类图,并分析相应的数据流操作:根据步骤一的分析,设计出相应的项目实体类图,并且画出对应的数据流向图,帮助你的代码编写。
(3)数据库层面操作:连接数据库,并且能够自动展示出数据库中的所有表Table以及视图View等数据库对象,支持开发者在选择对应数据表的时候,程序自动查询出该表含有的所有字段信息等。同时建议考虑支持多表SQL语句操作。
(4)操作界面设计层面考虑:根据上述几个步骤的分析,结合我们最后要实现的效果,设计出界面操作图。如博主当初在设计Web版本的代码生成器的时候,当选择对应的数据表后,需要添加该表对应的页面的Title信息,表的字段分别对应数据展示列表的哪一列,该列是否需要设置格式化函数等(如设置数据表中的字段Name最终展示在HTML前端界面的列表列【姓名】列中)。
(5)代码的生成以及保存:根据第一步分析出来的结果,结合后面几部的操作,使用C#代码自动生成对应的代码格式,并将该代码格式的字符串保存到相应的文件中,如.CS为后缀的实体类文件、.cshtml为后缀的展示层View文件等。在生成代码保存文件的时候,建议生成对应的文件夹目录,这样方便在生成代码后直接将文件夹拷贝到对应的项目中即可,省去了自己新建文件的流程。
(6)Web版本代码生成器建议最后做一个代码文件打包压缩下载功能。
鉴于代码生成器的整个流程比较繁琐复杂,针对这套的实现,将分文章章节来记录,此篇文章优先记录如何从数据库中获取所有的表对象、视图对象,以及选择相应的数据表后读取对应表的所有字段信息。
需要获取数据库的表对象、视图对象以及表中的字段,需要从数据库中的系统表中查询。
(1)获取选中数据库中的用户表,可以用以下几种方式都可以:
Select name from sys.tables;
Select name from sys.objects where type='U';
Select name from sysobjects where type='U';
Select table_name FROM InFormAtion_Schema.tables;
这里稍微做下解释:sys.tables是sqlserver2005版本中新增一个目录视图,它存储了当前数据库中的所有表信息。sys.objects和sysobjects都代表系统对象表。
其中type的类型有多种,分别代表不同的含义:U=用户表、S=系统表、V=视图、FN=标量函数、TF=表函数、P=存储过程、TR=触发器、D=默认值或者Default约束、PK=主键约束、F=外键约束、UQ=UNIQUE 唯一约束。
(2)获取选中数据库中的视图View,可以用以下几种方式都可以:
SELECT * FROM INFORMATION_SCHEMA.VIEWS; SELECT * FROM sysobjects where type='V'; SELECT * FROM sys.objects where type='V';
(3)获取选中的数据表中的所有字段信息以及字段的类型
查找出对应的字段类型后在生成实体类的时候就可以自动生成属性的对应的C#类型,如nvarchar、varchar、ntext等类型对应C#中的String类型。
//查询表Product下面的所有字段信息
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Product'
//查询视图V_Product下面的所有字段信息
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'V_Product'
使用C#开发代码生成器的流程暂时先记录到这,后续的相关设计流程等将在下一篇的文章中记录。
最后附上博主的个人技术站点,里面也发布了不少技术知识点文章,包含服务器运维等知识:IT技术小趣屋。
可以关注博主下列公众号,后期代码梳理好后进行公布。此外还有C#编写的扫雷游戏源码(完整解决方案源码,可以直接编译运行):https://pan.baidu.com/s/1T4zVndyypzY9i9HsLiVtGg。提取密码请关注博主公众号后,发送消息:扫雷源码。
博主个人技术交流群:960640092,博主微信公众号如下:

使用C#编写自己的代码生成器,附代码讲解(一)的更多相关文章
- JPA中实现双向多对多的关联关系(附代码下载)
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- 如何编写高质量的C#代码(一)
从"整洁代码"谈起 一千个读者,就有一千个哈姆雷特,代码质量也同样如此. 想必每一个对于代码有追求的开发者,对于"高质量"这个词,或多或少都有自己的一丝理解.当 ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- HTML Inspector – 帮助你编写高质量的 HTML 代码
HTML Inspector 是一款代码质量检测工具,帮助你编写更优秀的 HTML 代码.HTML Inspector 使用 JavaScript 编写,运行在浏览器中,是最好的 HTML 代码检测工 ...
- 分享5种风格的 jQuery 分页效果【附代码】
jPaginate 是一款非常精致的分页插件,提供了五种不同风格的分页效果,支持鼠标悬停翻页,快速分页功能.这款插件还提供了丰富的配置选项,你可以根据需要进行设置. 效果演示 源码下载 各个 ...
- 使用 Promises 编写更优雅的 JavaScript 代码
你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...
- 编写可测试的JavaScript代码
<编写可测试的JavaScript代码>基本信息作者: [美] Mark Ethan Trostler 托斯勒 著 译者: 徐涛出版社:人民邮电出版社ISBN:9787115373373上 ...
- 编写高效的js/jQuery代码 :rocket:
讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...
- iOS应用开发最佳实践系列一:编写高质量的Objective-C代码
本文由海水的味道编译整理,转载请注明译者和出处,请勿用于商业用途! 点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的 ...
随机推荐
- drf2 FBV和CBV
FBV 基于函数的视图 CBV 基于类的视图 也就是说我们是用函数编写视图~还是类编写视图 urlpatterns = [ path('admin/', admin.site.urls), path( ...
- __LINE__的用法
简单的说,__LINE__可以获取当前代码的函数,结合__FUNCTION__可以打印调试信息,比如函数出错时运行的函数名,及行号,例如 #define p_err_fun , os_time_get ...
- Mysql中比较常用的两种存储引擎和事务
存储引擎:引擎(类似汽车上的发动机)决定了数据库的快慢,MySql中有20多个引擎,不同的存储引擎提供不同的存储机制.索引技巧.锁定水平.MYISAM存储引擎,INNODB存储引擎最出名.数据库的核心 ...
- linux命令_文件目录操作命令
# linux命令--文件和目录操作命令 pwd "print working directory" 打印工作目录的绝对路径 范例: 在bash命令行显示当前用户的完整路径 系统B ...
- 技术文档生成工具:appledoc
做项目一般都会要求写技术文档,特别是提供SDK或者基础组件的.如果手写这类技术文档的话,工作量比编写代码也少不了多少.比如 Java 语言本身就自带 javadoc 命令,可以从源码中抽取文档.本篇我 ...
- C#.Net平台与OPC服务器通讯
最近,我们Ndolls工作室承接了山大某个自动化控制项目,主要做了一套工控信息化系统,其中有一个功能模块是将系统管理的一部分数据参数发送至OPC服务器,由OPC服务器接收数据后执行相应工控操作.第一次 ...
- Bashu2445 -- 【网络流24题-10】餐巾问题
2445 -- [网络流24题-10]餐巾问题 Description 一个餐厅在相继的n天里,每天需要用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1,2,…,n).餐厅可以购买新的餐巾,每块餐 ...
- struts2框架学习笔记5:OGNL表达式
OGNL取值范围分两部分,root.Context两部分 可以放置任何对象作为ROOT,CONTEXT中必须是Map键值对 示例: 准备工作: public void fun1() throws Ex ...
- javaScript 二分查找
什么是二分查找的,举个栗子: var arr = [1, 3, 5, 7, 9, 11, 14, 15, 17, 19, 20]; 上面有序数组, 随便给你一位 9 ,输出该数在数组中的索引. 当 ...
- SQL Server性能优化(11)非聚集索引的覆盖索引存储结构
一,非聚集索引的include 非聚集索引的Include属性可以让非聚集索引包含其他列.如 CREATE NONCLUSTERED INDEX [NonIxUser] ON [dbo].[Users ...