在微软的.net开发类库中,我们找不到现成转换方法,所以就需要考虑自行开发这个功能了,然而实现起来并不是很复杂,其中要用到的主要技术就是反射。利用反射,我们能够获取该对象数组中对象的每一个属性,包括其名称、类型,然后利用这些信息来创建DataSet中数据表的Schema,当创建完成以后,将该对象数组的每一个对象的属性数据复制到刚才创建的数据表中,这样就很简单的完成了该功能的实现,还是用代码来说的更清楚些:
文件: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; } }