在開發(fā)中可能會遇到這幾種情況:
1、EF或LINQ查詢出來的匿名對象在其它地方調(diào)用不方便,又懶的手動建實體類
2、通過datatable反射實體需要先建一個類 ,頭痛
3、通過SQL語句返回的實體也需要先建一個類 ,頭痛
4、如果通過代碼生成器要寫模版,需要安裝或者不想生成一堆不用的類
為了解決上面的不便之處,我封裝了一個實體生成類,可以扔到程序里面任意調(diào)用
封裝類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Text.RegularExpressions; namespace SyntacticSugar { /// summary> /// ** 描述:實體生成類 /// ** 創(chuàng)始時間:2015-4-17 /// ** 修改時間:- /// ** 作者:sunkaixuan /// ** qq:610262374 歡迎交流,共同提高 ,命名語法等寫的不好的地方歡迎大家的給出寶貴建議 /// /summary> public class ClassGenerating { /// summary> /// 根據(jù)匿名類獲取實體類的字符串 /// /summary> /// param name="entity">匿名對象/param> /// param name="className">生成的類名/param> /// returns>/returns> public static string DynamicToClass(object entity, string className) { StringBuilder reval = new StringBuilder(); StringBuilder propertiesValue = new StringBuilder(); var propertiesObj = entity.GetType().GetProperties(); string replaceGuid = Guid.NewGuid().ToString(); string nullable = string.Empty; foreach (var r in propertiesObj) { var type = r.PropertyType; if (type.IsGenericType type.GetGenericTypeDefinition() == typeof(Nullable>)) { type = type.GetGenericArguments()[0]; nullable = "?"; } if (!type.Namespace.Contains("System.Collections.Generic")) { propertiesValue.AppendLine(); string typeName = ChangeType(type); propertiesValue.AppendFormat("public {0}{3} {1} {2}", typeName, r.Name, "{get;set;}", nullable); propertiesValue.AppendLine(); } } reval.AppendFormat(@" public class {0}{{ {1} }} ", className, propertiesValue); return reval.ToString(); } /// summary> /// 根據(jù)DataTable獲取實體類的字符串 /// /summary> /// param name="sql">/param> /// param name="className">/param> /// returns>/returns> public static string DataTableToClass(DataTable dt, string className) { StringBuilder reval = new StringBuilder(); StringBuilder propertiesValue = new StringBuilder(); string replaceGuid = Guid.NewGuid().ToString(); foreach (DataColumn r in dt.Columns) { propertiesValue.AppendLine(); string typeName = ChangeType(r.DataType); propertiesValue.AppendFormat("public {0} {1} {2}", typeName, r.ColumnName, "{get;set;}"); propertiesValue.AppendLine(); } reval.AppendFormat(@" public class {0}{{ {1} }} ", className, propertiesValue); return reval.ToString(); } /// summary> /// 根據(jù)SQL語句獲取實體類的字符串 /// /summary> /// param name="sql">SQL語句/param> /// param name="className">生成的類名/param> /// param name="server">服務(wù)名/param> /// param name="database">數(shù)據(jù)庫名稱/param> /// param name="uid">賬號/param> /// param name="pwd">密碼/param> /// returns>/returns> public static string SqlToClass(string sql, string className, string server, string database, string uid, string pwd) { using (SqlConnection conn = new SqlConnection(string.Format("server={0};uid={2};pwd={3};database={1}", server, database, uid, pwd))) { SqlCommand command = new SqlCommand(); command.Connection = conn; command.CommandText = sql; DataTable dt = new DataTable(); SqlDataAdapter sad = new SqlDataAdapter(command); sad.Fill(dt); var reval = DataTableToClass(dt, className); return reval; } } /// summary> /// 根據(jù)SQL語句獲取實體類的字符串 /// /summary> /// param name="sql">SQL語句/param> /// param name="className">生成的類名/param> /// param name="connName">webconfig的connectionStrings name/param> /// returns>/returns> public static string SqlToClass(string sql, string className, string connName) { string connstr = System.Configuration.ConfigurationManager.ConnectionStrings[connName].ToString(); if (connstr.Contains("metadata"))//ef connstr = Regex.Match(connstr, @"connection string\=""(.+)""").Groups[1].Value; using (SqlConnection conn = new SqlConnection(connstr)) { SqlCommand command = new SqlCommand(); command.Connection = conn; command.CommandText = sql; DataTable dt = new DataTable(); SqlDataAdapter sad = new SqlDataAdapter(command); sad.Fill(dt); var reval = DataTableToClass(dt, className); return reval; } } /// summary> /// 匹配類型 /// /summary> /// param name="type">/param> /// returns>/returns> private static string ChangeType(Type type) { string typeName = type.Name; switch (typeName) { case "Int32": typeName = "int"; break; case "String": typeName = "string"; break; } return typeName; } } }
調(diào)用如下:
//通過匿名對象生成實體類 var dynamicObj = new { id = 1, name = "小名", entity = new enityt1() }; //注意:只能是單個實體不能傳入 ListT> ,集合需要 List[0] string classCode = ClassGenerating.DynamicToClass(dynamicObj, "classDynamic"); //通過datatable生成實體類 DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name"); classCode = ClassGenerating.DataTableToClass(dt, "classTatabale"); //通過sql語句生成實體類 classCode = ClassGenerating.SqlToClass("select * from note", "Note", "127.0.0.1", "MyWork", "sa", "sasa"); classCode = ClassGenerating.SqlToClass("select * from dbo.AccessoriesDetail", "AccessoriesDetail", "NFDEntities");//通過 config connstring名稱
然后在調(diào)試狀態(tài)把你需要的結(jié)果CTRL+C 然后去新建一個類CTRL+V
標(biāo)簽:賀州 廣元 固原 淮北 咸寧 吉林 池州 樂山
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET中實現(xiàn)根據(jù)匿名類、datatable、sql生成實體類》,本文關(guān)鍵詞 ASP.NET,中,實現(xiàn),根據(jù),匿名,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。