обработчик рекурсивных ошибок - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть следующий код, где я пытаюсь получить все свойства объекта, а также значения свойств.Некоторые свойства могут быть коллекциями или коллекциями коллекций, поэтому я попытался настроить рекурсивную функцию для этих типов.К сожалению, это не работает, ошибка в этой строке

if (property.GetValue(item, null) is IEnumerable)

, и я не знаю, что изменилось.Кто-нибудь может здесь помочь?Спасибо.

public static string PackageError(IEnumerable<object> obj)
{
    var sb = new StringBuilder();

    foreach (object o in obj)
    {
        sb.Append("<strong>Object Data - " + o.GetType().Name + "</strong>");
        sb.Append("<p>");

        PropertyInfo[] properties = o.GetType().GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            if (pi.GetValue(o, null) is IEnumerable && !(pi.GetValue(o, null) is string))
                sb.Append(GetCollectionPropertyValues((IEnumerable)pi.GetValue(o, null)));
            else
                sb.Append(pi.Name + ": " + pi.GetValue(o, null) + "<br />");
        }

        sb.Append("</p>");
    }

    return sb.ToString();
}

public static string GetCollectionPropertyValues(IEnumerable collectionProperty)
{
    var sb = new StringBuilder();

    foreach (object item in collectionProperty)
    {
        PropertyInfo[] properties = item.GetType().GetProperties();
        foreach (var property in properties)
        {
            if (property.GetValue(item, null) is IEnumerable)
                sb.Append(GetCollectionPropertyValues((IEnumerable)property.GetValue(item, null)));
            else
                sb.Append(property.Name + ": " + property.GetValue(item, null) + "<br />");
        }
    }

    return sb.ToString();
}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Похоже, что это конкретное свойство является индексатором, поэтому он ожидает, что вы передадите значения индекса в метод GetValue. Нет простого способа взять индексатор и определить, какие значения допустимы для передачи в качестве индексов, в общем случае, поскольку класс свободен для реализации индексатора так, как он этого хочет. Например, словарь с ключом в строке имеет индексатор по ключу, который может принимать индексы, перечисленные в свойстве Keys.

Типичный подход к сериализации коллекций состоит в том, чтобы обрабатывать их как особый случай, обрабатывая каждый примитивный тип коллекции (массив, список, словарь и т. Д.) По отдельности.

Обратите внимание, что здесь есть разница между свойством, возвращающим IEnumerable, и индексатором.

0 голосов
/ 01 декабря 2011

Я бы предложил использовать существующий механизм сериализации, такой как сериализация XML или сериализация JSON, для предоставления этой информации, если вы пытаетесь сделать ее универсальной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...