欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁(yè) > 軟件編程 > C#教程 >

C# 通過(guò)反射初探ORM框架的實(shí)現(xiàn)原理(詳解)

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次

背景:

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

反射:

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

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

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

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

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

調(diào)用無(wú)參構(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)來(lái)一個(gè)對(duì)象 newObj
f.SetValue(newObj, r[name]); 

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

練習(xí)

下面就是通過(guò)反射將從數(shù)據(jù)庫(kù)中獲取到的結(jié)果集自動(dòng)封裝到Bean中。無(wú)需手動(dòng)封裝

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);
 }

以上這篇C# 通過(guò)反射初探ORM框架的實(shí)現(xiàn)原理(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有