国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# 通過反射初探ORM框架的實現原理(詳解)

2020-01-24 00:22:46
字體:
來源:轉載
供稿:網友

背景:

以前學的Java進行開發,多用到Mybatis,Hiberante等ORM框架,最近需要上手一個C#的項目,由于不是特別難,也不想再去學習C#的ORM框架,所以就想著用反射簡單的實現一下ORM框架的內容,簡單的增刪改查,沒有用到多表之間的聯系。

反射:

Java和C#中的反射大體相同,主要是指程序可以訪問,檢測和修改它本身狀態或行為的一種能力,并能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。我的理解就是可以程序運行時動態的獲取對象的屬性和方法,并且可以進行與之相關的調用。

首先看一下C#中反射實現方式:

獲取Type對象,反射操作都需要通過Type對象來進行。

通過全限定名來獲取 Type tp = Type.GetType("TJCommon.Dao.Deriver");通過類來獲取 Type tp = typeof(Int)

獲取到Type對象后我們可以通過其構造方法來創建對象

調用無參構造

// 獲取類的初始化構造信息 ConstructorInfo ct = tp.GetConstructor(System.Type.EmptyTypes);// 調用不帶參數的構造器T newObj = (T)ct.Invoke(null);

調用有參構造

//定義參數類型數組 Type[] tps = new Type[2]; tps[0] = typeof(int); tps[1] = typeof(string); //獲取類的初始化參數信息 ConstructorInfo ct2 = tp.GetConstructor(tps); //定義參數數組 object[] obj = new object[2]; obj[0] = (object)100; obj[1] = (object)"Param Example"; //調用帶參數的構造器 ExampleClass Ex2 = (ExampleClass)ct2.Invoke(obj);

獲得所有公共字段

// 獲取到所有公共字段FieldInfo[] arr = t.GetFields(); // 給指定的字段賦值 需要傳遞進來一個對象 newObjf.SetValue(newObj, r[name]); 

這里就介紹這幾個方法,通過反射可以獲得類中的所有信息,并且可以進行調用,還可以打破封裝(不安全)

練習

下面就是通過反射將從數據庫中獲取到的結果集自動封裝到Bean中。無需手動封裝

public static T dataToObj(String str) {  String strSql = str;  DataSet ds = SqlCompose.ExecuteSqlQuery(strSql);  Type t = typeof(T);  DataRow r = ds.Tables[0].Rows[0]; // 找到一行  FieldInfo[] arr = t.GetFields(); // 返回所有公共字段(public)  ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes);  T newObj = (T)ct.Invoke(null);  if (r != null)  {  foreach (FieldInfo f in arr)// 遍歷所有字段  {   string name = f.Name;   Type type2 = f.FieldType;   if (r[name].GetType() != typeof(DBNull))   {   string typeName = f.FieldType.Name;   f.SetValue(newObj, r[name]);   }  }  }  else  {  newObj = default(T);  }  ds.Tables.Clear();  return newObj; }

封裝到List

public static List<T> dataToList(String str)  {   List<T> list = new List<T>();   String strSql = str;   DataSet ds = SqlCompose.ExecuteSqlQuery(strSql);   Type t = typeof(T);   FieldInfo[] arr = t.GetFields(); // 返回所有公共字段(public)   ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes);   foreach (DataRow dr in ds.Tables[0].Rows)   {    T newObj = (T)ct.Invoke(null);    foreach (FieldInfo f in arr)// 遍歷所有字段    {     string name = f.Name;     Type type2 = f.FieldType;     string typeName = f.FieldType.Name;     if (dr[name].GetType() != typeof(DBNull))     {      f.SetValue(newObj, dr[name]);     }    }    list.Add(newObj);   }   ds.Tables.Clear();   return list;  }

拼接字符串進行insert操作

public static void inserByBean(string tableName, T target) {  StringBuilder sql = new StringBuilder(); // 拼接的sql  sql.Append("insert into "+tableName+"(");  Type t = target.GetType();  PropertyInfo[] ps = t.GetProperties();  for (int i = 0; i < ps.Length; i++)  {   object obj = ps[i].GetValue(target, null);   if (obj != null)   {    string name = ps[i].Name;    if (i != ps.Length - 1)    {     sql.Append(" " + name + ",");    }    else    {     sql.Append(" " + name + "");    }   }  }  sql.Append(") values(");  for (int i = 0; i < ps.Length; i++)  {   object obj = ps[i].GetValue(target, null);   if (obj != null)   {    if (i != ps.Length - 1)    {     if (ps[i].PropertyType == typeof(string) || ps[i].PropertyType == typeof(DateTime))     {      sql.Append("'" + obj + "',");     }     else {      sql.Append("" + obj + ",");     }    }    else    {     if (ps[i].PropertyType == typeof(string) || ps[i].PropertyType == typeof(DateTime))     {      sql.Append("'" + obj + "')");     }     else     {      sql.Append("" + obj + ")");     }    }   }  }  string resultSql = sql.ToString();  SqlCompose.ExecuteSqlNonQuery(resultSql); }

以上這篇C# 通過反射初探ORM框架的實現原理(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙田区| 赤水市| 肇州县| 湖南省| 温宿县| 南丰县| 阿拉善左旗| 靖江市| 凤翔县| 庄浪县| 叙永县| 钟祥市| 新邵县| 沈丘县| 凌源市| 嵩明县| 法库县| 天峨县| 图片| 奉新县| 嘉义县| 平舆县| 武穴市| 海阳市| 汽车| 辽宁省| 团风县| 岳西县| 平邑县| 黄山市| 久治县| 舟曲县| 略阳县| 奉新县| 巍山| 深圳市| 蓬溪县| 屯昌县| 舞钢市| 清水县| 彭水|