[转]利用.NET中的反射机制实现IList到DataTable的转换
上一篇 / 下一篇 2008-04-16 09:14:53 / 个人分类:1
本文的意义并不仅仅是为了说明如何将IList转换为DataTable,而是给出一个利用反射来实现对各种数据结构(集合类)相互转换的通用方法的编写思路。
相信很多使用过Nhibernate的朋友都知道,通过NH访问数据库,数据都是以ILIST形式返回的,这就为我们在.NET中使用传统的数据绑定造成了不便。由于NH返回的ILIST所装载的对象往往都是不同的,我们会为每个返回的LIST单独编写转换方法,而利用反射机制却可以做成通用的转换方法。
代码如下(C#):
using System;无忧脚本4l(v,OU1W^v
using System.Collections.Generic;
u*q/p7H;~/S
d0using System.Text;无忧脚本3LE;gC)^7V.b
using System.Data;无忧脚本sfiR+i9XHB-j7YNYJ
using System.Collections;无忧脚本6Ea%zycfkE`
using System.Reflection;
namespace KycBaseModule
C
zhrO;^8Fin!fQ9e0{无忧脚本X3`c T bGIK
public class KycFunction无忧脚本;R_skLN*n2[$j
{
\
y&{,JkI{+j0 public KycFunction() { }无忧脚本g k\9C$M7J#o+Mk
/**//// <summary>
%Y Y
hZq0 /// 实现对IList到DataSet的转换
V4]^`c k:jE8tTK0 /// </summary>
3bx"UFp
o0 /// <param name="ResList">待转换的IList</param>
j N)]A&l6KV.l0 /// <returns>转换后的DataSet</returns>
SP6Ey-`q.p0 public static DataSet ListToDataSet(IList ResList)
T8i:hhVQ? v0 {无忧脚本fA P4l&Mwwl1A]
DataSet RDS=new DataSet();
*JD%qq,y;P0 DataTable TempDT = new DataTable();
//此处遍历IList的结构并建立同样的DataTable无忧脚本_$w
v~y5X-l
v~a,{
System.Reflection.PropertyInfo[] p = ResList[0].GetType().GetProperties();无忧脚本v/F:l|X6B
foreach (System.Reflection.PropertyInfo pi in p)
-["m.Le8u"T0 {无忧脚本'z5c/r/@ U?n y&V~
TempDT.Columns.Add(pi.Name,System.Type.GetType(pi.PropertyType.ToString()));无忧脚本E~hMX*SM'G
}
for (int i = 0; i < ResList.Count; i++)无忧脚本&z8z_
]l
I
{无忧脚本 RD `9sq w7W@
IList TempList = new ArrayList();
)oi3v3y].Zn0 //将IList中的一条记录写入ArrayList无忧脚本8W.@{]Wr-r}
foreach (System.Reflection.PropertyInfo pi in p)
"P6b8S$fo4c3`0 {无忧脚本.E2Y
N M&u2y&S
object o = pi.GetValue(ResList[i], null);无忧脚本0Q+| F1A r*^}YC
TempList.Add(oo);无忧脚本y WJ5Yu|aY)Q
?
}无忧脚本*X4G6` d| w
]8o
xw7n|8J2]|Yk0 object[] itm=new object[p.Length];无忧脚本Y{&a\)aVb
//遍历ArrayList向object[]里放数据
8?c3[6d7x:w!~
`0 for (int j = 0; j < TempList.Count; j++)无忧脚本 _ d e;S'c2Gt
{
7wLCP2i2bg
A?)@0 itm.SetValue(TempList[j], j);
,[(R
~)N#y-P@e0 }无忧脚本K"}h5h$A6v{/G&](]
//将object[]的内容放入DataTable
5Q/Y cVuh0 TempDT.LoadDataRow(itm, true);无忧脚本| k"K*y5}nfK
}
$h[Z/Jw:tJ-\7H)c-R0 //将DateTable放入DataSet
5i:i{EC+g@0 RDS.Tables.Add(TempDT);无忧脚本9MA)B[q9P
//返回DataSet
+e(g~ aWtJW/H0 return RDS;
WVLWg3jH0 }无忧脚本t:v9k~
jL^
}
\n0kP{.H0}无忧脚本'KT$mB$\.}M1W9e)S
TAG:
