C#中將DataTable轉(zhuǎn)化成List<T>的方法解析
前言
通常在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)。
- 簡單類型包含:整型,布爾型,字符型 (整型的一種特殊情況),浮點型,小數(shù)型。
- 整型包含:
sbyte、byte、short、ushort、int、uint、long、ulong和char。 - 引用類型:引用類型不存儲它們所代表的實際數(shù)據(jù),但它們存儲實際數(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:
{
//引用類型 必須對泛型實例化
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í)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
欄 目:C#教程
下一篇:C#中數(shù)組、ArrayList和List三者的區(qū)別詳解
本文標(biāo)題:C#中將DataTable轉(zhuǎn)化成List&lt;T&gt;的方法解析
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6138.html
您可能感興趣的文章
- 01-10C#實現(xiàn)實體類與字符串互相轉(zhuǎn)換的方法
- 01-10時間戳與時間相互轉(zhuǎn)換(php .net精確到毫秒)
- 01-10C#實現(xiàn)HTML轉(zhuǎn)WORD及WORD轉(zhuǎn)PDF的方法
- 01-10C#編程實現(xiàn)對象與JSON串互相轉(zhuǎn)換實例分析
- 01-10Silverlight將圖片轉(zhuǎn)換為byte的實現(xiàn)代碼
- 01-10C#使用正則表達(dá)式實現(xiàn)首字母轉(zhuǎn)大寫的方法
- 01-10C#編程實現(xiàn)DataTable添加行的方法
- 01-10C#中使用JSON.NET實現(xiàn)JSON、XML相互轉(zhuǎn)換
- 01-10C#實現(xiàn)DataTable映射成Model的方法(附源碼)
- 01-10C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子


