65.9K
CodeProject 正在变化。 阅读更多。
Home

将集合转换为表

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.89/5 (17投票s)

2004年4月27日

CPOL

1分钟阅读

viewsIcon

58721

一个函数将集合转换为表格。

引言

你可以使用这段代码将业务对象转换回表格,并对它们执行 XML 连接或选择语句和筛选。你也可以使用 XML 序列化器来完成同样的事情。哪个更好,取决于情况。我认为这种方式更好,因为你拥有源代码,而且非常简单,对于小型表格来说速度也很快。如果你的自定义集合类支持 IBindingList,XML 序列化器可能会给你带来一些很大的麻烦。(实际上,其中存在已知错误。)如果你有一个非常大的表格,你可能需要使用 XML 序列化器。(至少,我希望它比这种方式更优化。)

话虽如此,你可能永远不会遇到需要这种情况的情况,但这又是另一个话题了。

让我们开始吧。

  1. 使用反射解析集合中项目的属性。
  2. System.Reflection.PropertyInfo [] propInfo = alist[0].GetType().GetProperties();

    现在你有一个属性名称数组 (propInfo)。

  3. 将这些属性作为列添加到表格中
  4. 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;
}
© . All rights reserved.