最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中將DataTable轉化成List<T>的方法解析

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

前言

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

泛型的好處: 它為使用c#語言編寫面向對象程序增加了極大的效力和靈活性。不會強行對值類型進行裝箱和拆箱,或對引用類型進行。當涉及到兩者之間的轉換時,就顯得有些較為繁瑣。這個其中的問題主要在兩者的存儲方式,DataTable的存儲方式采用一種二維表的方式進行數(shù)據(jù)的存儲操作,DataTable表示內存中數(shù)據(jù)的一個表。在List集合中,List的本質就是一個數(shù)組,則采用一種線性結構對數(shù)據(jù)進行存儲。

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

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

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

現(xià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.具體的轉換操作方法:

 /// <summary>
 /// datatable轉換為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也當做值類型處理
 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:
 {
 //引用類型 必須對泛型實例化
 model = Activator.CreateInstance<T>();
 //獲取model中的屬性
 var modelPropertyInfos = type.GetProperties();
 //遍歷model每一個屬性并賦值DataRow對應的列
 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("不支持該類型轉換");
 default:
  throw new Exception("未知類型");
 }
 }
 }
 break;
 default:
 model = default(T);
 break;
 }
 return model;
 }

總結

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

相關文章

  • C#部署數(shù)據(jù)庫及IIS站點

    C#部署數(shù)據(jù)庫及IIS站點

    這篇文章主要為大家詳細介紹了C#部署數(shù)據(jù)庫及IIS站點的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C# 操作符之三元操作符淺析

    C# 操作符之三元操作符淺析

    C# 操作符之三元操作符“?:”是如何使用的呢?C# 操作符之三元操作符“?:”需要注意的是什么呢?那么本文就向你簡單介紹C# 操作符之三元操作符“?:”的基本情況。
    2011-02-02
  • C# 無邊框窗體邊框陰影效果的簡單實現(xiàn)

    C# 無邊框窗體邊框陰影效果的簡單實現(xiàn)

    這篇文章介紹了C# 無邊框窗體邊框陰影效果的簡單實現(xiàn),有需要的朋友可以參考一下
    2013-10-10
  • C#使用NPOI實現(xiàn)Excel導入導出功能

    C#使用NPOI實現(xiàn)Excel導入導出功能

    這篇文章主要為大家詳細介紹了C#使用NPOI實現(xiàn)Excel導入導出功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#判斷字符串是否是int/double(實例)

    C#判斷字符串是否是int/double(實例)

    本文主要分享了C#判斷字符串是否是int/double的具體實例,具有一定的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • C#中Dictionary類使用實例

    C#中Dictionary類使用實例

    這篇文章主要介紹了C#中Dictionary類使用實例,本文直接給出一個使用實例,包含一些Dictionary的基本用法,需要的朋友可以參考下
    2015-06-06
  • C#通過抽象工廠模式造車

    C#通過抽象工廠模式造車

    這篇文章介紹了C#通過抽象工廠模式造車的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C#中的is和as操作符區(qū)別小結

    C#中的is和as操作符區(qū)別小結

    這篇文章主要介紹了C#中的is和as操作符區(qū)別小結,is是驗證操作對象是不是自己希望的,as是將對象轉換成指定類型,需要的朋友可以參考下
    2015-01-01
  • C#中的問號(?號)用法小結

    C#中的問號(?號)用法小結

    這篇文章主要介紹了C#中的問號(?號)用法小結,本文介紹了3種用法,分別作為修飾符、運算符的用法,需要的朋友可以參考下
    2014-07-07
  • 詳解C#如何讀寫config配置文件

    詳解C#如何讀寫config配置文件

    這篇文章主要介紹了詳解C#如何讀寫config配置文件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論

大名县| 中西区| 明水县| 枣庄市| 庆元县| 吴堡县| 安西县| 安丘市| 洪雅县| 尼勒克县| 财经| 拉萨市| 克东县| 福安市| 甘孜县| 密云县| 应用必备| 嘉鱼县| 调兵山市| 探索| 田阳县| 阿克| 威信县| 海原县| 讷河市| 嘉峪关市| 武冈市| 包头市| 五寨县| 黔江区| 铜鼓县| 沂水县| 马鞍山市| 台中县| 合川市| 会泽县| 綦江县| 紫云| 井陉县| 阳新县| 克山县|