C# 开发学习笔记:动态生成.cs文件

本文介绍了一种使用C#动态生成表结构类的方法,包括字段、属性及增删改查等常用方法的实现。通过反射和CodeDOM,能够快速生成与数据库表对应的类文件。

学习自:https://blog.youkuaiyun.com/csdn1987/article/details/89677563

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PXPublic
{
    /// <summary>
    /// 动态生成类文件
    /// </summary>
    public class GeneratorClass
    {
        static string fieldName = "";
        static string commentText = "";//生成字段、属性、方法时的注释文本
        static string methodCode = "";//生成方法时方法内部的代码片段

        /// <summary>
        /// 动态生成表结构类文件
        /// </summary>
        /// <param name="tableInfo">要生成类文件的表信息</param>
        public static void GeneratorTableClass(MyDataSet tableInfo)
        {
            for (int i = 0; i < tableInfo.Tables[0].Rows.Count; i++)
            {
                //准备一个代码编译器单元

                CodeCompileUnit unit = new CodeCompileUnit();
                //设置命名空间(这个是指要生成的类的空间)
                CodeNamespace myNamespace = new CodeNamespace("TableManager");

                //导入必要的命名空间引用
                myNamespace.Imports.Add(new CodeNamespaceImport("System"));
                myNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
                myNamespace.Imports.Add(new CodeNamespaceImport("System.Linq"));
                myNamespace.Imports.Add(new CodeNamespaceImport("System.Text"));
                myNamespace.Imports.Add(new CodeNamespaceImport("System.Threading.Tasks"));
                myNamespace.Imports.Add(new CodeNamespaceImport("System.Data"));

                //声明一个名为className的CodeTypeDeclaration 
                CodeTypeDeclaration myClass = new CodeTypeDeclaration(tableInfo.Tables[0].Rows[i]["tableName"].ToString()); 
                myClass.IsClass = true;    //指定该CodeTypeDeclaration为一个类
                myClass.TypeAttributes = TypeAttributes.Public;  //该类为公开的

                //把这个类放在这个命名空间下
                myNamespace.Types.Add(myClass);

                //把该命名空间加入到编译器单元的命名空间集合中
                unit.Namespaces.Add(myNamespace);

                // 根据表名查询表的字段信息
                string sql = " SELECT  DISTINCT A.COLUMN_NAME" +
                            "     ,B.COMMENTS " +
                            "     ,A.DATA_TYPE " +
                            "     ,A.DATA_LENGTH" +
                            "     ,A.DATA_SCALE    " +
                            "     ,A.NULLABLE    " +
                            "     ,D.col#    " +
                            "     FROM USER_TAB_COLUMNS A,USER_COL_COMMENTS B,sys.col$ D" +
                            "     WHERE A.TABLE_NAME = B.TABLE_NAME" +
                            "     AND A.COLUMN_NAME = B.COLUMN_NAME" +
                            "     AND D.NAME= A.COLUMN_NAME" +
                            "     AND D.obj# IN (SELECT object_id FROM all_objects WHERE  object_name = @TABLE_NAME )" +
                            "     AND A.TABLE_NAME =@TABLE_NAME " +
                            "     ORDER BY D.col# ";
                DBManager.ParameterAdd("TABLE_NAME", tableInfo.Tables[0].Rows[i]["tableName"].ToString());
                MyDataSet outDs = new MyDataSet();
                int resultFlag = PXPublic.DBManager.ExcuteSelect(sql, outDs);
                // 抽时间添加log4Net日志模块
                
                //公用字段声明
                CodeMemberField member = new CodeMemberField(typeof(System.String), "tableName");
                member.Attributes = MemberAttributes.Private | MemberAttributes.Static; //设置访问类型
                commentText = "\n/ <summary>\n" +
                                    "/ 数据表名称\n" +
                                    "/ </summary>";
                member.Comments.Add(new CodeCommentStatement(commentText));
                myClass.Members.Add(member);  //把该字段添加到类中

                member = new CodeMemberField(typeof(System.String), "tableCname");
                member.Attributes = MemberAttributes.Private | MemberAttributes.Static; //设置访问类型
                commentText = "\n/ <summary>\n" +
                                    "/ 数据表描述\n" +
                                    "/ </summary>";
                member.Comments.Add(new CodeCommentStatement(commentText));
                myClass.Members.Add(member);  //把该字段添加到类中

                //添加属性
                CodeMemberProperty property = new CodeMemberProperty();               

                // 声明数据表结构字段
                foreach (DataRow dr in outDs.Tables[0].Rows)
                {
                    // 字段相关属性设置
                    fieldName = dr["COLUMN_NAME"].ToString().ToLower()+"_";
                    if (dr["DATA_TYPE"].ToString() == "VARCHAR2")
                        member = new CodeMemberField(typeof(System.String), fieldName);
                    else if (dr["DATA_TYPE"].ToString() == "NUMBER")
                        member = new CodeMemberField(typeof(System.Decimal), fieldName);
                    member.Attributes = MemberAttributes.Private | MemberAttributes.Static; //设置访问类型
                    commentText = "\n/ <summary>\n" +
                                        "/ " + dr["COMMENTS"].ToString() +"\n"+
                                        "/ </summary>";
                    member.Comments.Add(new CodeCommentStatement(commentText));
                    myClass.Members.Add(member);  //把该字段添加到类中


                    // 属性相关信息设置
                    property = new CodeMemberProperty();
                    //设置访问类型
                    property.Attributes = MemberAttributes.Public | MemberAttributes.Sta
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值