數組轉成dataset
objectArrayToDataSet.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Reflection;
public class ArrayToDataSet
{
public static DataSet ObjectArrayToDataSet(object[] objArr)
{
if (objArr.Length == 0)
return null;
DataSet ds = CreateDataSet(objArr[0].GetType());
ds = FillDataSet(ds, objArr);
return ds;
}
public static DataSet CreateDataSet(Type t)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
PropertyInfo[] pis = t.GetProperties();
foreach (PropertyInfo pi in pis)
{
DataColumn dc = new DataColumn(pi.Name, pi.PropertyType);
dt.Columns.Add(dc);
}
return ds;
}
public static DataSet FillDataSet(DataSet ds, object[] objArr)
{
DataColumnCollection dcs = ds.Tables[0].Columns;
Type t = objArr[0].GetType();
foreach (object obj in objArr)
{
DataRow dr = ds.Tables[0].NewRow();
for (int i = 0; i < dcs.Count; i++)
{
dr[i] = t.InvokeMember(dcs[i].ColumnName, BindingFlags.GetProperty,
null, obj, null);
}
ds.Tables[0].Rows.Add(dr);
}
return ds;
}
}
最簡(jiǎn)單的方法就是手動(dòng)建一個(gè)DataTable。為每個(gè)Materiel的property建一個(gè)Column,然后指明其數據類(lèi)型。建好Table之后,循環(huán)為每個(gè)Materiel創(chuàng )建一個(gè)新行。如果多有幾個(gè)界面,雖然做起來(lái)都差不多,但代碼很難重用。
另外數據都是從WebService獲取,form不允許直接訪(fǎng)問(wèn)DB,所以也不能通過(guò)ADO.net獲取DataTable。
經(jīng)過(guò)一段時(shí)間的考量后決定見(jiàn)一個(gè)專(zhuān)用的Utility類(lèi)EntityCollectionsConvert,接口為
復制 保存DataTable ToDataTable(object[] entitys);
DataTable ToDataTable<T>(List<T> entitys)
實(shí)現的原理也比較簡(jiǎn)單
1.將判斷entitys不為空;
2.取出entitys的所有property
3.在DataTable中為每個(gè)property添加一列(包括元素類(lèi)型)
4.為每個(gè)entity添加一行。
5.自動(dòng)生成單元測試,測試,添加到項目中
復制 保存public static DataTable ToDataTable<T>(List<T> entitys)
{
//檢查實(shí)體集合不能為空
if (entitys == null || entitys.Count < 1)
{
throw new Exception("需轉換的集合為空");
}
//取出第一個(gè)實(shí)體的所有Propertie
Type entityType = entitys[0].GetType();
PropertyInfo[] entityProperties = entityType.GetProperties();
//生成DataTable的structure
//生產(chǎn)代碼中,應將生成的DataTable結構Cache起來(lái),此處略
DataTable dt = new DataTable();
for (int i = 0; i < entityProperties.Length; i++)
{
dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
}
//將所有entity添加到DataTable中
foreach (object entity in entitys)
{
//檢查所有的的實(shí)體都為同一類(lèi)型
if (entity.GetType() != entityType)
{
throw new Exception("要轉換的集合元素類(lèi)型不一致");
}
object[] entityValues = new object[entityProperties.Length];
for (int i = 0; i < entityProperties.Length; i++)
{
entityValues[i] = entityProperties[i].GetValue(entity, null);
}
dt.Rows.Add(entityValues);
}
return dt;
}
IList轉DataTable