这是我在写一个WEB SERVICE时遇到的问题。我需要传送一个数据对象的集合给客户端,具体说是传送一个用户对象的数组。根据客户端的要求,我要把数据对象转化为dataset返回给客户端。
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
//第一步,使用反射,获取SESGMemberShipUser的属性的名字和数据类型,在datatable中为这些属性创建对应的datacolumn。
Type theType = Type.GetType("SESGMemberShipUser");
// get all fields
PropertyInfo[] InfoArray = theType.GetProperties();
foreach (PropertyInfo Info in InfoArray)
{
dt.Columns.Add(new DataColumn(Info.Name, Info.PropertyType));//insert the data into the table
}
//第二步,从业务层取得数据对象的集合,然后将每个对象作为一条记录,插入到新创见的datatable中。
SESGMemberShipUserCollection users = SESG.Security.SESGRoles.GetSESGUsersInRole(role);
for (int i = 0; i < users.Count; i++)
{
SESGMemberShipUser user = users[i];
DataRow dr = dt.NewRow();
foreach (PropertyInfo Info in InfoArray)
{
dr[Info.Name] = Info.GetValue(user,null);
}
dt.Rows.Add(dr);
}
ds.AcceptChanges();
return ds;
}
这个需求很简单,自己创建dataset,datatable。把数据对象的field映射为datatable的列,然后将一个对象转化为一条datarow。
不过我发现,这个被传送的数据对象SESGMemberShipUser可能经常要变化,比如增加个属性什么的,这就比较麻烦了。因为每次当SESGMemberShipUser修改后,我都要重新将数据对象转换为dataset。
这时,套用一句流行广告。多亏有了反射,它的动态调用,能自如地应付这种变化,让我能安心地睡个好觉:)
public DataSet GetUsersInRole(string role)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
//第一步,使用反射,获取SESGMemberShipUser的属性的名字和数据类型,在datatable中为这些属性创建对应的datacolumn。
Type theType = Type.GetType("SESGMemberShipUser");
// get all fields
PropertyInfo[] InfoArray = theType.GetProperties();
foreach (PropertyInfo Info in InfoArray)
{
dt.Columns.Add(new DataColumn(Info.Name, Info.PropertyType));//insert the data into the table
}
//第二步,从业务层取得数据对象的集合,然后将每个对象作为一条记录,插入到新创见的datatable中。
SESGMemberShipUserCollection users = SESG.Security.SESGRoles.GetSESGUsersInRole(role);
for (int i = 0; i < users.Count; i++)
{
SESGMemberShipUser user = users[i];
DataRow dr = dt.NewRow();
foreach (PropertyInfo Info in InfoArray)
{
dr[Info.Name] = Info.GetValue(user,null);
}
dt.Rows.Add(dr);
}
ds.AcceptChanges();
return ds;
}