国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C# 通過反射初探ORM框架的實現原理(詳解)

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

2022-02-16 15:32cccc_hi C#

下面小編就為大家分享一篇C# 通過反射初探ORM框架的實現原理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

背景:

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

反射:

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

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

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

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

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

調用無參構造

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

調用有參構造

?
1
2
3
4
5
6
7
8
9
10
11
12
//定義參數類型數組
 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);

獲得所有公共字段

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

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

練習

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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框架的實現原理(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/liyuhui-Z/archive/2017/12/12/8026505.html

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
主站蜘蛛池模板: 精品动漫一区 | 黄色一级毛片免费看 | 久久中文字幕一区 | 午夜久久久 | 欧美成人精品在线视频 | 欧美精品三区 | 草草成人 | 亚洲国产精品久久久久秋霞蜜臀 | 欧美日韩91 | 中文字幕亚洲一区二区三区 | 精品久久久久一区二区国产 | 偷拍自拍亚洲欧美 | 亚洲精品一区二区三区不 | 成人久久久久久 | 日韩成人一级片 | 欧美日本韩国一区二区 | 日韩精品免费视频 | 久久这里有精品视频 | 中文字幕人成乱码在线观看 | 成人网在线视频 | 久久久久一区二区三区 | 亚洲成人免费在线 | 国产片在线观看 | av看片网站 | 久久av网站 | 日韩中文字幕视频在线观看 | 羞羞视频免费观看网站 | 91久久久久久久久久久久久 | 色综合视频在线 | 成人午夜影院 | 成人av免费观看 | 亚洲免费视频观看 | 久久精品日韩 | 7799精品视频 | 黄在线看| 91精品国产欧美一区二区成人 | 亚洲视频一区二区 | 欧美日韩国产精品 | 色av综合 | 国产美女自拍视频 | 日韩免费视频一区二区 |