亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何通過反射實現ORM框架

發布時間:2021-07-23 10:29:51 來源:億速云 閱讀:155 作者:小新 欄目:編程語言

這篇文章主要介紹了C#如何通過反射實現ORM框架,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

背景:

以前學的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(); 
// 給指定的字段賦值 需要傳遞進來一個對象 newObj
f.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框架”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

株洲县| 布尔津县| 郸城县| 深州市| 淮安市| 静乐县| 新晃| 和平县| 伊金霍洛旗| 灵寿县| 宜春市| 容城县| 安徽省| 镇远县| 通州区| 洛宁县| 文山县| 于田县| 车险| 宿松县| 汝州市| 都昌县| 陆丰市| 潼南县| 雷山县| 五指山市| 巴彦淖尔市| 孟州市| 阳泉市| 高雄县| 黎平县| 利川市| 藁城市| 宜宾市| 苍南县| 佛坪县| 玉环县| 五华县| 唐海县| 烟台市| 资源县|