欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用C#编写自己的代码生成器,附代码讲解(一)

程序员文章站 2022-11-17 23:52:02
使用过代码生成器的开发人员应该知道,通过代码生成器生成项目的代码,可以大大的减少重复编码的时间,提供项目开发的效率,将自己从繁杂重复的代码中解放出来。现在网络上也有很多的开源的代码生成器或者使用比较广泛的代码生成器,如动软代码生成器相信不少开发人员使用过。有时候在线的代码生成器生成的代码未必百分之百 ......

使用过代码生成器的开发人员应该知道,通过代码生成器生成项目的代码,可以大大的减少重复编码的时间,提供项目开发的效率,将自己从繁杂重复的代码中解放出来。现在网络上也有很多的开源的代码生成器或者使用比较广泛的代码生成器,如动软代码生成器相信不少开发人员使用过。有时候在线的代码生成器生成的代码未必百分之百符合我们的心意,符合项目的需要,此时我们可以考虑自己使用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技术小趣屋