ASP.NET中實(shí)現(xiàn)根據(jù)匿名類、datatable、sql生成實(shí)體類
在開發(fā)中可能會(huì)遇到這幾種情況:
1、EF或LINQ查詢出來的匿名對(duì)象在其它地方調(diào)用不方便,又懶的手動(dòng)建實(shí)體類
2、通過datatable反射實(shí)體需要先建一個(gè)類 ,頭痛
3、通過SQL語句返回的實(shí)體也需要先建一個(gè)類 ,頭痛
4、如果通過代碼生成器要寫模版,需要安裝或者不想生成一堆不用的類
為了解決上面的不便之處,我封裝了一個(gè)實(shí)體生成類,可以扔到程序里面任意調(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>
/// ** 描述:實(shí)體生成類
/// ** 創(chuàng)始時(shí)間:2015-4-17
/// ** 修改時(shí)間:-
/// ** 作者:sunkaixuan
/// ** qq:610262374 歡迎交流,共同提高 ,命名語法等寫的不好的地方歡迎大家的給出寶貴建議
/// </summary>
public class ClassGenerating
{
/// <summary>
/// 根據(jù)匿名類獲取實(shí)體類的字符串
/// </summary>
/// <param name="entity">匿名對(duì)象</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獲取實(shí)體類的字符串
/// </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語句獲取實(shí)體類的字符串
/// </summary>
/// <param name="sql">SQL語句</param>
/// <param name="className">生成的類名</param>
/// <param name="server">服務(wù)名</param>
/// <param name="database">數(shù)據(jù)庫(kù)名稱</param>
/// <param name="uid">賬號(hào)</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語句獲取實(shí)體類的字符串
/// </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)用如下:
//通過匿名對(duì)象生成實(shí)體類
var dynamicObj = new { id = 1, name = "小名", entity = new enityt1() };
//注意:只能是單個(gè)實(shí)體不能傳入 List<T> ,集合需要 List[0]
string classCode = ClassGenerating.DynamicToClass(dynamicObj, "classDynamic");
//通過datatable生成實(shí)體類
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name");
classCode = ClassGenerating.DataTableToClass(dt, "classTatabale");
//通過sql語句生成實(shí)體類
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 然后去新建一個(gè)類CTRL+V

- Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)
- java 中使用匿名類直接new接口詳解及實(shí)例代碼
- Java中匿名類的兩種實(shí)現(xiàn)方式
- java 內(nèi)部類(匿名類,匿名對(duì)象,靜態(tài)內(nèi)部類)詳解及實(shí)例
- PHP7匿名類用法分析
- 使用 Lambda 取代 Android 中的匿名類
- 全面了解Java中的內(nèi)部類和匿名類
- 深入講解C#編程中嵌套類型和匿名類型的定義與使用
- 詳細(xì)解讀C++編程中的匿名類類型和位域
- Java通過匿名類來實(shí)現(xiàn)回調(diào)函數(shù)實(shí)例總結(jié)
相關(guān)文章
asp.net實(shí)現(xiàn)生成縮略圖及給原始圖加水印的方法示例
這篇文章主要介紹了asp.net實(shí)現(xiàn)生成縮略圖及給原始圖加水印的方法,結(jié)合具體實(shí)例形式分析了asp.net圖片的縮略圖與水印操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
Coolite優(yōu)化導(dǎo)出Excel文件實(shí)現(xiàn)代碼
Coolite 優(yōu)化 導(dǎo)出 Excel 文件??梢栽O(shè)定列寬和導(dǎo)出列選擇。2010-03-03
ASP.NET中Web.config文件的層次關(guān)系詳細(xì)介紹
Web.config 是一個(gè)基于 XML 的配置文件,該文件的作用是對(duì)應(yīng)用程序進(jìn)行配置,下面為大家介紹下ASP.NET中Web.config文件的層次關(guān)系2014-01-01
.NET 解決TabControl 頁里面多余邊距問題經(jīng)驗(yàn)分享
不知道各位同學(xué)有沒有遇到在向TabPage添加內(nèi)容后,里面的東西總是填不滿 TabPage,總是有幾個(gè)像素的空白邊距2012-04-04
使用DataGrid中擴(kuò)展ItemRenderer和HeaderRenderer進(jìn)行操作
這兩天在用Flex DataGrid做點(diǎn)東西,走了不少?gòu)澛罚F(xiàn)將心得分享一下。2009-02-02
基于.NET程序默認(rèn)啟動(dòng)線程數(shù)講解
本篇文章小編為大家介紹,基于.NET程序默認(rèn)啟動(dòng)線程數(shù)講解。需要的朋友參考下2013-04-04
ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

