@ astander и @Frederik, по сути, ответили на вопросы и проблемы, которые вы специально озвучили, но я хотел бы предложить сделать это немного более эффективно. В зависимости от количества экземпляров объектов, которые вы хотите записать в свой файл, представленный вами метод может оказаться весьма неэффективным. Это потому, что вы собираете информацию о типе и значении, размышляя о каждой итерации, что не нужно.
То, что вы ищете, это то, что ищет информацию о типе один раз, а затем использует отражение только для получения значения свойств и полей, например, (.NET 3.5),
public static IEnumerable<string> ReturnRecs(IEnumerable items, bool returnHeader, string delimiter)
{
bool haveFoundMembers = false;
bool haveOutputHeader = false;
PropertyInfo[] properties = null;
FieldInfo[] fields = null;
foreach (var item in items)
{
if (!haveFoundMembers)
{
Type type = item.GetType();
properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(pi => pi.PropertyType.IsValueType || pi.PropertyType == typeof (string)).ToArray();
fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(fi => fi.FieldType.IsValueType || fi.FieldType == typeof(string)).ToArray();
haveFoundMembers = true;
}
if (!haveOutputHeader)
{
yield return String.Join(delimiter, properties.Select(pi => pi.Name)
.Concat(fields.Select(pi => pi.Name)).ToArray());
haveOutputHeader = true;
}
yield return String.Join(delimiter,
properties.Select(pi => pi.GetValue(item, null).ToString())
.Concat(fields.Select(fi => fi.GetValue(item).ToString())).ToArray());
}
Приведенный выше код выполняет только GetProperties
и GetFields
один раз для группы записей - также из-за этого нет необходимости явно сортировать свойства и поля, как это было @ Frederik's предложение.