一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - C# - C#中反射和擴展方法如何運用

C#中反射和擴展方法如何運用

2022-01-04 14:59碼上猿夢 C#

這篇文章主要為大家詳細介紹了C#中反射和擴展方法的運用,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前段時間做了一個練手的小項目,名叫Book_Bar,用來賣書的,采用的是三層架構,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL層中各個類中有一個方法比較常用,那就是RowToClass ,顧名思義,也就是將DataTable 中的數據封裝到Models 中。結果導致在DAL各個類中寫了很多類似的方法,后來就直接把它抽取出來做成了DataTable和DataRow的擴展方法,下面是代碼:

?
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
 
 
namespace DAL
{
 /// <summary>
 /// 用于給 DataTable和 DataRow擴展方法
 /// </summary>
 public static class TableExtensionMethod
 {
 
  /// <summary>
  /// 功能:
  ///  給DataTable擴展了一個方法,能夠將DataTable中的行轉變為對應的class對象,并封裝到List集合中;
  /// </summary>
  /// <typeparam name="T">需要轉變成為的class類型</typeparam>
  /// <param name="table">傳入的DataTable對象</param>
  /// <returns>返回一個封裝了對應class的List集合</returns>
  public static List<T> TableToClass<T>(this DataTable table)
  {
   Type type = typeof(T);
   PropertyInfo[] propArr = type.GetProperties();//獲取所有屬性
   List<T> list = new List<T>();
   DataRowCollection rows = table.Rows;
   int len = rows[0].ItemArray.Length;//獲取第一行的列數,即class的屬性個數
   for (int i = 0; i < rows.Count; i++)
   {
    T t = (T)Activator.CreateInstance(type);
    for (int j = 0; j < len; j++)//這里之所以不使用propArr.Length,是因為有些Models的屬性在數據表中不存在對應的列
    {
     propArr[j].SetValue(t, rows[i][j]);
    }
    list.Add(t);
    t = default(T);
   }
   return list;
  }
 
  /// <summary>
  /// 功能:
  ///  DataRow的擴展方法;
  ///  能夠將DataRow對象封裝到泛型對象中
  /// </summary>
  /// <typeparam name="T">需要轉換成為的class類型</typeparam>
  /// <param name="row">被轉換的行</param>
  /// <returns>封裝了行數據的class對象</returns>
  public static T RowToClass<T>(this DataRow row)
  {
   //Type type = Assembly.Load(classFullName).GetType();
   Type type = typeof(T);
   T t = (T)Activator.CreateInstance(type);
   PropertyInfo[] propArr = type.GetProperties();
   int len = row.ItemArray.Length;
   for (int i = 0; i < len; i++)
   {
    propArr[i].SetValue(t, row[i]);
   }
   return t;
  }
 
  /// <summary>
  /// 功能:
  ///  DataRowCollection的擴展方法;
  ///  能夠將DataRowCollection對象封裝到泛型List集合中
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="rows"></param>
  /// <returns></returns>
  public static List<T> RowToClass<T>(this DataRow row, DataRow[] rowArr)
  {
   Type type = typeof(T);
   PropertyInfo[] propArr = type.GetProperties();
   int len = rowArr[0].ItemArray.Length;//獲取數據表第一行的列數,即屬性個數
   List<T> list = new List<T>();
   for (int i = 0; i < rowArr.Length; i++)
   {
    T t = (T)Activator.CreateInstance(type);
    for (int j = 0; j < len; j++)
    {
     propArr[j].SetValue(t, rowArr[i][j]);
    }
    list.Add(t);
    t = default(T);
   }
   return list;
  }
 }
}

上面用到了泛型,反射,擴展方法。

之前在使用這行代碼時出了點小問題:

propArr[i].SetValue(t, row[i]);

報了一個類型轉換異常,斷點調試之后發現是因為 Models 中的屬性的排列和數據表的列的順序不一樣導致的,參照數據表中字段的順序修改過來就好,還有一點就是在循環對屬性進行賦值時,我選用的是數據表中列的個數,而不是屬性的個數,(也就是代碼中這里之所以不使用propArr.Length,是因為有些Models的屬性在數據表中不存在對應的列
)。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/daimajun/p/6818069.html

延伸 · 閱讀

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

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

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

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

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

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

    E-iceblue5012022-02-12
  • C#Unity3D實現虛擬按鈕控制人物移動效果

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

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

    shenqingyu060520232410972022-03-11
  • C#C#通過KD樹進行距離最近點的查找

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

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

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

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

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

    吳 劍8332021-12-08
  • C#深入解析C#中的交錯數組與隱式類型的數組

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

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

    C#教程網6172021-11-09
  • C#WPF 自定義雷達圖開發實例教程

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

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

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

    C#實現XML文件讀取

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

    Just_for_Myself6702022-02-22
主站蜘蛛池模板: 97国产精品久久碰碰牛牛 | av在线亚洲男人的天堂 | 小柔的性放荡羞辱日记动漫 | 亚欧精品在线观看 | 精品国产免费 | 91九色国产porny | 国产农村一一级特黄毛片 | 国产小情侣自拍 | 无人在线视频高清免费观看动漫 | 国产欧美久久一区二区 | 国产成人+亚洲欧洲 | 久久学生精品国产自在拍 | 国产高清精品自在久久 | 美女福利视频网站 | 国产一久久香蕉国产线看观看 | 精品一区二区三区免费站 | 日本xxx在线观看免费播放 | 91国语自产拍在线观看 | 91香蕉国产在线观看人员 | 日韩高清一区二区 | 91东航翘臀女神在线播放 | 亚洲精品第二页 | 国产精品探花一区在线观看 | 美女艹b | 欧美最猛性xxxxx男男 | 亚洲欧美日韩另类在线一 | 92精品国产成人观看免费 | 操熟美女又肥又嫩的骚屁股 | 久久日韩精品无码一区 | 极品手交handjobtattoo | 4虎影院永久地址www | 99精彩视频 | 91青青草原 | 丰满大乳欲妇三级k8 | 国产剧情麻豆刘玥视频 | 人人做人人爽人人爱 | 亚洲国产在线观看免费视频 | 小舞同人18av黄漫网站 | 亚洲精品高清中文字幕完整版 | 小柔的性放荡羞辱日记 | 青草免费在线 |