将集合转换为表
一个函数将集合转换为表格。
引言
你可以使用这段代码将业务对象转换回表格,并对它们执行 XML 连接或选择语句和筛选。你也可以使用 XML 序列化器来完成同样的事情。哪个更好,取决于情况。我认为这种方式更好,因为你拥有源代码,而且非常简单,对于小型表格来说速度也很快。如果你的自定义集合类支持 IBindingList
,XML 序列化器可能会给你带来一些很大的麻烦。(实际上,其中存在已知错误。)如果你有一个非常大的表格,你可能需要使用 XML 序列化器。(至少,我希望它比这种方式更优化。)
话虽如此,你可能永远不会遇到需要这种情况的情况,但这又是另一个话题了。
让我们开始吧。
- 使用反射解析集合中项目的属性。
- 将这些属性作为列添加到表格中
System.Reflection.PropertyInfo [] propInfo = alist[0].GetType().GetProperties();
现在你有一个属性名称数组 (propInfo
)。
dt.Columns.Add(propInfo[i].Name);
现在我们要做的是获取集合项目属性的值,并将其设置到正确的行中。为此,使用 InvokeMember
调用集合项目的属性。
你将收到一个对象 (object t
),你所要做的就是将其转换为正确的类型,并将其存储在相应的行中。
注意:这个示例只是使用 ToString
,这可能不是你想要的,因为每个列的数据类型都是字符串。但是,我只是用它来从业务对象创建一些报告,所以对于这个目的,它工作得很好。
for(int row =0;row < alist.Count ; row++)
{
dr = dt.NewRow();
for (int i=0;i< propInfo.Length;i++)
{
object tempObject =alist[row];
object t =tempObject.GetType().InvokeMember(propInfo[i].Name,
R.BindingFlags.GetProperty , null,tempObject , new object [] {});
if (t!=null)
dr[i] = t.ToString();
}
dt.Rows.Add(dr);
完整函数
这是完整的代码
private DataTable CreateDataSource(ArrayList alist)
{
DataTable dt = new DataTable();
if (!alist[0])
throw new FormatException("Parameter ArrayList empty");
dt.TableName = alist[0].GetType().Name;
DataRow dr;
System.Reflection.PropertyInfo [] propInfo =
alist[0].GetType().GetProperties();
for(int i=0; i< propInfo.Length;i++)
{
dt.Columns.Add(propInfo[i].Name);
}
for(int row =0;row < alist.Count ; row++)
{
dr = dt.NewRow();
for (int i=0;i< propInfo.Length;i++)
{
object tempObject =alist[row];
object t =tempObject.GetType().InvokeMember(propInfo[i].Name,
R.BindingFlags.GetProperty , null,tempObject , new object [] {});
if (t!=null)
dr[i] = t.ToString();
}
dt.Rows.Add(dr);
}
return dt;
}