В сторону: для возврата столбцов в известном порядке: там равно нет определенного порядка для элементов, кроме того, который вы создаете. Например ( из 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 (полезно, если вы делаете это много)