欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中將DataTable轉(zhuǎn)化成List<T>的方法解析

 更新時間:2016年12月02日 11:32:28   作者:彭澤0902  
大家應(yīng)該都知道在.net項(xiàng)目中使用到DataTable和List<T>集合的地方較多,有的時候需要將DataTable轉(zhuǎn)化成List<T>,那么改如何轉(zhuǎn)化呢?下面通過這篇文章來一起學(xué)習(xí)下吧,本文中給出了詳細(xì)的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值。

前言

通常在DAL層我們都需要把DataTable轉(zhuǎn)換為List<T>讓調(diào)用者盡可能的好用,盡量的不用關(guān)心數(shù)據(jù)庫的字段等,所以我們一般傳過去的都是List<T>而不是DataTable。

泛型的好處: 它為使用c#語言編寫面向?qū)ο蟪绦蛟黾恿藰O大的效力和靈活性。不會強(qiáng)行對值類型進(jìn)行裝箱和拆箱,或?qū)σ妙愋瓦M(jìn)行。當(dāng)涉及到兩者之間的轉(zhuǎn)換時,就顯得有些較為繁瑣。這個其中的問題主要在兩者的存儲方式,DataTable的存儲方式采用一種二維表的方式進(jìn)行數(shù)據(jù)的存儲操作,DataTable表示內(nèi)存中數(shù)據(jù)的一個表。在List集合中,List的本質(zhì)就是一個數(shù)組,則采用一種線性結(jié)構(gòu)對數(shù)據(jù)進(jìn)行存儲。

在轉(zhuǎn)換過程中,主要的問題在于不同類型的處理上,主要分為值類型和引用類型兩大類。

C#中值類型總是含有相應(yīng)該類型的一個值,指類型包含:簡單類型(Simple types ),結(jié)構(gòu)類型(struct types),枚舉類型(Enumeration types)。

  • 簡單類型包含:整型,布爾型,字符型 (整型的一種特殊情況),浮點(diǎn)型,小數(shù)型。
  • 整型包含: sbyte byte、 shortushort、 int、 uint、 longulong char。
  • 引用類型:引用類型不存儲它們所代表的實(shí)際數(shù)據(jù),但它們存儲實(shí)際數(shù)據(jù)的引用。主要包含:對象類型,類類 型,接口,代表元,字符串類型,數(shù)組。

現(xiàn)提供轉(zhuǎn)換的代碼,僅供參考:

1.類型枚舉:

 /// <summary>
 /// 類型枚舉
 /// </summary>
 private enum ModelType
 {
 //值類型
 Struct,
 Enum,
 //引用類型
 String,
 Object,
 Else
 }


 private static ModelType GetModelType(Type modelType)
 {
 //值類型
 if (modelType.IsEnum)
 {
 return ModelType.Enum;
 }
 //值類型
 if (modelType.IsValueType)
 {
 return ModelType.Struct;
 }
 //引用類型 特殊類型處理
 if (modelType == typeof(string))
 {
 return ModelType.String;
 }
 //引用類型 特殊類型處理
 return modelType == typeof(object) ? ModelType.Object : ModelType.Else;
 }

2.具體的轉(zhuǎn)換操作方法:

 /// <summary>
 /// datatable轉(zhuǎn)換為List<T>集合
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="table"></param>
 /// <returns></returns>
 public static List<T> DataTableToList<T>(DataTable table)
 {
 var list = new List<T>();
 foreach (DataRow item in table.Rows)
 {
 list.Add(DataRowToModel<T>(item));
 }
 return list;
 }

 public static T DataRowToModel<T>(DataRow row)
 {
 T model;
 var type = typeof(T);
 var modelType = GetModelType(type);
 switch (modelType)
 {
 //值類型
 case ModelType.Struct:
 {
 model = default(T);
 if (row[0] != null)
 model = (T)row[0];
 }
 break;
 //值類型
 case ModelType.Enum:
 {
 model = default(T);
 if (row[0] != null)
 {
 var fiType = row[0].GetType();
 if (fiType == typeof(int))
 {
 model = (T)row[0];
 }
 else if (fiType == typeof(string))
 {
 model = (T)Enum.Parse(typeof(T), row[0].ToString());
 }
 }
 }
 break;
 //引用類型 c#對string也當(dāng)做值類型處理
 case ModelType.String:
 {
 model = default(T);
 if (row[0] != null)
 model = (T)row[0];
 }
 break;
 //引用類型 直接返回第一行第一列的值
 case ModelType.Object:
 {
 model = default(T);
 if (row[0] != null)
 model = (T)row[0];
 }
 break;
 //引用類型
 case ModelType.Else:
 {
 //引用類型 必須對泛型實(shí)例化
 model = Activator.CreateInstance<T>();
 //獲取model中的屬性
 var modelPropertyInfos = type.GetProperties();
 //遍歷model每一個屬性并賦值DataRow對應(yīng)的列
 foreach (var pi in modelPropertyInfos)
 {
 //獲取屬性名稱
 var name = pi.Name;
 if (!row.Table.Columns.Contains(name) || row[name] == null) continue;
 var piType = GetModelType(pi.PropertyType);
 switch (piType)
 {
 case ModelType.Struct:
  {
  var value = Convert.ChangeType(row[name], pi.PropertyType);
  pi.SetValue(model, value, null);
  }
  break;
 case ModelType.Enum:
  {
  var fiType = row[0].GetType();
  if (fiType == typeof(int))
  {
  pi.SetValue(model, row[name], null);
  }
  else if (fiType == typeof(string))
  {
  var value = (T)Enum.Parse(typeof(T), row[name].ToString());
  if (value != null)
  pi.SetValue(model, value, null);
  }
  }
  break;
 case ModelType.String:
  {
  var value = Convert.ChangeType(row[name], pi.PropertyType);
  pi.SetValue(model, value, null);
  }
  break;
 case ModelType.Object:
  {
  pi.SetValue(model, row[name], null);
  }
  break;
 case ModelType.Else:
  throw new Exception("不支持該類型轉(zhuǎn)換");
 default:
  throw new Exception("未知類型");
 }
 }
 }
 break;
 default:
 model = default(T);
 break;
 }
 return model;
 }

總結(jié)

以上的操作中,對不同類型有對應(yīng)的處理方式。好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 使用C#實(shí)現(xiàn)替換文件中的IP地址

    使用C#實(shí)現(xiàn)替換文件中的IP地址

    這篇文章主要為大家詳細(xì)介紹了如何使用C#來處理一個實(shí)際的編程挑戰(zhàn):讀取一個配置文件并替換其中的IP地址,感興趣的小伙伴可以了解下
    2024-01-01
  • Unity的AssetPostprocessor?Model動畫函數(shù)使用案例深究

    Unity的AssetPostprocessor?Model動畫函數(shù)使用案例深究

    這篇文章主要介紹了Unity的AssetPostprocessor?Model動畫函數(shù)使用案例的深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C#正則表達(dá)式與HashTable詳解

    C#正則表達(dá)式與HashTable詳解

    這篇文章主要介紹了C#正則表達(dá)式與HashTable詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • C#中this指針的用法示例

    C#中this指針的用法示例

    這篇文章主要介紹了C#中this指針的用法,對初學(xué)者而言是非常重要的概念,必須加以熟練掌握,需要的朋友可以參考下
    2014-08-08
  • C#?漢明距離的算法實(shí)現(xiàn)

    C#?漢明距離的算法實(shí)現(xiàn)

    漢明距離是用來衡量兩個等長字符串之間差異的度量指標(biāo),本文主要介紹了C#?漢明距離的算法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • C#處理Paint事件的方法

    C#處理Paint事件的方法

    這篇文章主要介紹了C#處理Paint事件的方法,實(shí)例分析了C#使用Paint進(jìn)行圖形繪制的技巧,需要的朋友可以參考下
    2015-06-06
  • Unity3D實(shí)現(xiàn)虛擬按鈕控制人物移動效果

    Unity3D實(shí)現(xiàn)虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#對DataTable里數(shù)據(jù)排序的方法

    C#對DataTable里數(shù)據(jù)排序的方法

    在日常開發(fā)過程中,有一個DataTable集合,里面有很多字段,現(xiàn)在要求針對某一列進(jìn)行排序,如果該列為數(shù)字的話,進(jìn)行ASC即可實(shí)現(xiàn),但是該字段類型為string,此時排序就有點(diǎn)不正確了
    2013-11-11
  • VS2019使用快捷鍵將代碼對齊的方法

    VS2019使用快捷鍵將代碼對齊的方法

    這篇文章主要介紹了VS2019使用快捷鍵將代碼對齊的相關(guān)資料,非常不錯對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 基于C#?wpf實(shí)現(xiàn)桌面放大鏡

    基于C#?wpf實(shí)現(xiàn)桌面放大鏡

    做桌面截屏功能時需要放大鏡,顯示鼠標(biāo)所在位置的放大圖像,所以本文為大家介紹了如何基于C#?wpf實(shí)現(xiàn)桌面放大鏡功能,有需要的小伙伴可以參考下
    2023-09-09

最新評論