csharpToClass通過表明自動生成類
阿新 • • 發佈:2019-01-29
原理其實很簡單,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的同事說過,可以動態地增加以及刪除類的屬性,感覺有點炫酷