本文意义并不仅仅是为了介绍说明如何将IList转换为DataTable而是给出个利用反射来实现对各种数据结构(集合类)相互转换通用思路方法编写思路.
相信很多使用过Nhibernate朋友都知道通过NH访问数据库数据都是以ILIST形式返回这就为我们在.NET中使用传统数据绑定造成了不便由于NH返回ILIST所装载对象往往都是区别我们会为每个返回LIST单独编写转换思路方法而利用反射机制却可以做成通用转换思路方法.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Reflection;

namespace  KycBaseModule
{
public KycFunction
{
public KycFunction(){ }
/**//// <summary>
/// 实现对IList到DataSet转换
/// </summary>
/// <param name="ResList">待转换IList</param>
/// <returns>转换后DataSet</returns>
public static DataSet ListToDataSet(IList ResList)
{
DataSet RDS=new DataSet;
DataTable TempDT = new DataTable;

//此处遍历IList结构并建立同样DataTable
System.Reflection.PropertyInfo p = ResList[0].GetType().GetProperties();
foreach (System.Reflection.PropertyInfo pi in p)
{
TempDT.Columns.Add(pi.Name,System.Type.GetType(pi.PropertyType.ToString()));
}

for (int i = 0; i < ResList.Count; i++)
{
IList TempList = new ArrayList;
//将IList中条记录写入ArrayList
foreach (System.Reflection.PropertyInfo pi in p)
{
object oo = pi.GetValue(ResList[i], null);
TempList.Add(oo);
}

object  itm=new object[p.Length];
//遍历ArrayList向object里放数据
for (int j = 0; j < TempList.Count; j++)
{
itm.SetValue(TempList[j], j);
}
//将object内容放入DataTable
TempDT.LoadDataRow(itm, true);
}
//将DateTable放入DataSet
RDS.Tables.Add(TempDT);
//返回DataSet
return RDS;
}
}
}

由上面代码可以看出实现过程非常简单首先利用反射将传入思路方法IList中对象所包含属性进行获取然后根据获取属性建立DataTableColumns然后利用循环遍历整个IList将每个结点对象所包含内容依次复制到DataTable由于该代码取自真实项目模块所以保留了原有命名空间和将DataTable放入DataSet几行.
posted on 2009-06-12 16:03  arong.NET  阅读(520)  评论(1编辑  收藏  举报