溫馨提示×

溫馨提示×

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

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

C#如何通過反射實現(xiàn)ORM框架

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

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

背景:

以前學(xué)的Java進(jìn)行開發(fā),多用到Mybatis,Hiberante等ORM框架,最近需要上手一個C#的項目,由于不是特別難,也不想再去學(xué)習(xí)C#的ORM框架,所以就想著用反射簡單的實現(xiàn)一下ORM框架的內(nèi)容,簡單的增刪改查,沒有用到多表之間的聯(lián)系。

反射:

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

首先看一下C#中反射實現(xiàn)方式:

獲取Type對象,反射操作都需要通過Type對象來進(jìn)行。

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

獲取到Type對象后我們可以通過其構(gòu)造方法來創(chuàng)建對象

調(diào)用無參構(gòu)造

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

調(diào)用有參構(gòu)造

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

獲得所有公共字段

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

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

練習(xí)

下面就是通過反射將從數(shù)據(jù)庫中獲取到的結(jié)果集自動封裝到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;
  }

拼接字符串進(jìn)行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);
 }

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#如何通過反射實現(xiàn)ORM框架”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI