1. 程式人生 > >csharpToClass通過表明自動生成類

csharpToClass通過表明自動生成類

         原理其實很簡單,oracle有個表儲存列的型別以及備註,我們關聯一下讀取出這些資訊之後,按照.net的規則控制一下縮排,就能有自動生成類的效果了,之所以會做這個,是因為之前用過一個jsonToCsharp的線上網站轉換,就想到可以做一個類似的東西。廢話不多說,下面直接貼程式碼;

          首先是讀取需要的資訊

string sql = @"select t1.column_name,data_type,nullable,comments from (
                            select table_name, column_name, data_type, data_default, nullable from user_tab_cols where Table_Name = '{0}'
                                )t1
                            RIGHT JOIN
                            (   
                                select column_name, comments from user_col_comments where Table_Name = '{0}'
                            )t2
                            on t1.column_name = t2.column_name";
            sql = string.Format(sql, tableName.ToUpper());
            var reader = await this.ExcuteQuery(sql);
            List<tableContent> list = new List<tableContent>();
            while (await reader.ReadAsync())
            {
                var obj = new tableContent();
                obj.ColumnName = reader.GetString(0);
                obj.DataType = reader.GetString(1);
                obj.IsNullable = reader.GetString(2);
                obj.Comment = reader.GetString(3);

                list.Add(obj);
            }
            sql = @"SELECT t.comments FROM user_tab_comments t WHERE t.table_name = '{0}'";
            sql = string.Format(sql, tableName.ToUpper());
            var result = await this.ExcuteQueryReturnOne(sql);
            list.ForEach(p => p.TableComment = result);
            return list;

然後就是按照語法規則以及縮排生成類字串

            StringBuilder sbClass = new StringBuilder(5000);
            //新增類名
            sbClass.Append("/// <summary>\n");
            sbClass.Append(string.Format("/// {0}\n", listtableContent[0].TableComment));
            sbClass.Append("/// </summary>\n");
            sbClass.Append("public class " + tableName + "\n{\n");
            //迴圈新增列
            int count = 1;
            foreach (tableContent obj in listtableContent)
            {

                string datatype = GetDataTypeFromOracleType(obj.DataType);
                var propertyName = obj.ColumnName.ToLower();
                sbClass.Append(string.Format("\tprivate {1} {0};\n", propertyName, datatype));
                //添加註釋
                sbClass.Append("\t/// <summary>\n");
                sbClass.Append(string.Format("\t/// {0}\n", obj.Comment));
                sbClass.Append("\t/// </summary>\n");


                //sbClass.Append(string.Format("public {2} {1} { get => {0}; set => {0} = value; }\n\n", obj.ColumnName, Function.GetFirstUpperCharacter(obj.ColumnName), datatype));
                sbClass.Append(string.Format("\tpublic {0} {1}\n", datatype, GetFirstUpperCharacter(obj.ColumnName)));
                sbClass.Append("\t{\n");
                sbClass.Append("\t\tget { return " + propertyName + "; }\n\t\tset { " + propertyName + " = value; }\n");
                sbClass.Append("\t}\n\n");

                count++;

            }
            //新增結束表機
            sbClass.Append("}");

            return sbClass.ToString();

基本上除了幾個fuction函式,其餘的直接copy過去你自己的專案就能使用了,最後我在考慮一個問題,要是.net能動態的把生成的這些類新增到專案裡面去就好了,不過這應該是動態語言才能做的,之前聽到ios的同事說過,可以動態地增加以及刪除類的屬性,感覺有點炫酷