亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

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

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

  • 簡(jiǎn)單類型包含:整型,布爾型,字符型 (整型的一種特殊情況),浮點(diǎn)型,小數(shù)型。
  • 整型包含: sbyte 、byteshort、 ushort、 intuint、 long、 ulong char。
  • 引用類型:引用類型不存儲(chǔ)它們所代表的實(shí)際數(shù)據(jù),但它們存儲(chǔ)實(shí)際數(shù)據(jù)的引用。主要包含:對(duì)象類型,類類 型,接口,代表元,字符串類型,數(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)換為L(zhǎng)ist<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#對(duì)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:
 {
 //引用類型 必須對(duì)泛型實(shí)例化
 model = Activator.CreateInstance<T>();
 //獲取model中的屬性
 var modelPropertyInfos = type.GetProperties();
 //遍歷model每一個(gè)屬性并賦值DataRow對(duì)應(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é)

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

相關(guān)文章

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

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

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

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

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

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

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

    C#中this指針的用法示例

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

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

    漢明距離是用來(lái)衡量?jī)蓚€(gè)等長(zhǎng)字符串之間差異的度量指標(biāo),本文主要介紹了C#?漢明距離的算法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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)虛擬按鈕控制人物移動(dòng)效果

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

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

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

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

    VS2019使用快捷鍵將代碼對(duì)齊的方法

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

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

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

最新評(píng)論