4

我正在尝试创建一个接受泛型List<T>并迭代返回 excel 文件的列表的函数byte[]。该函数需要能够确定对象的属性。因此,如果我通过 aList<person>并且 person 具有属性 first、last、age 等,我需要能够确定属性名称以创建 excel 列标题,然后我需要迭代列表以将属性值分配给列细胞。谁能指出我List<T>在通用函数中使用的一些示例代码?

4

3 回答 3

9

旁白:为了以已知顺序取回列:除了您创建的成员之外,没有定义成员的顺序。例如(来自 MSDN):

GetProperties 方法不按特定顺序返回属性,例如字母顺序或声明顺序。您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。

如果您不需要依赖顺序,则反射或 TypeDescriptor 都可以;例如(注意这会写入 TSV 文本,而不是byte[]- 我的解释是问题在于获取数据,而不是写入 Excel):

static void WriteTsv<T>(this IEnumerable<T> data, TextWriter output)
{
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
    foreach (PropertyDescriptor prop in props)
    {
        output.Write(prop.DisplayName); // header
        output.Write("\t");
    }
    output.WriteLine();
    foreach (T item in data)
    {
        foreach (PropertyDescriptor prop in props)
        {
            output.Write(prop.Converter.ConvertToString(
                 prop.GetValue(item)));
            output.Write("\t");
        }
        output.WriteLine();
    }
}

如果您需要订购,您需要:

  • 将其传入(例如,作为params string[] propertyNames
  • 在属性上使用属性
  • 使用字母

上述TypeDescriptor方法具有以下优点(优于GetType().GetProperties()):

  • 它适用于自定义对象模型(DataView例如,如果您使用IList
  • 您可以调整实现以提高性能 - 例如HyperDescriptor(如果您正在做很多事情,这很有用)
于 2009-12-02T06:48:24.877 回答
0

最简单的方法可能是将您的 List 转换为 DataTable,然后将 DataTable 转换为 Excel 电子表格

第二个链接将电子表格直接写入 ASP.NET 响应,这可以很容易地调整为返回一个字节 []。

于 2009-12-02T06:41:26.357 回答
0

使用您的集合支持的接口,例如IEnumerable

public byte[] Process(IEnumerable input) {
    foreach (var elem in input) {
        foreach (PropertyInfo prop in elem.GetType().GetProperties()) {
            Object value = prop.GetValue(elem, null);
            // add value to byte[]
        }
    }
    return bytes;
}
于 2009-12-02T06:50:14.343 回答