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