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

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

C#教程

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

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

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

前言

通常在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 byte、 shortushort、 int、 uint、 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)大家可以留言交流。

上一篇:C#實(shí)現(xiàn)文件上傳與下載功能實(shí)例

欄    目:C#教程

下一篇:C#中數(shù)組、ArrayList和List三者的區(qū)別詳解

本文標(biāo)題:C#中將DataTable轉(zhuǎn)化成List&amp;lt;T&amp;gt;的方法解析

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6138.html

網(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)所有