递归错误处理程序

时间:2011-11-30 20:57:53

标签: c# reflection recursion

我有以下代码,我试图获取对象的所有属性以及属性值。一些属性可以是集合或集合集合,因此我尝试为这些类型设置递归函数。不幸的是它不起作用,在这一行出错

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 :(得分:0)

我建议使用现有的序列化机制,例如XML序列化或JSON序列化,以便在尝试使其成为通用时提供此信息。

答案 1 :(得分:0)

听起来特定属性是索引器,所以它期望您将索引值传递给GetValue方法。在一般情况下,没有简单的方法来获取索引器并确定哪些值作为索引有效传递,因为类可以随意实现索引器。例如,键入字符串的Dictionary具有按键的索引器,它可以将Keys中的索引作为枚举。

序列化集合的典型方法是将它们作为特殊情况处理,分别处理每个基本集合类型(数组,列表,字典等)。

请注意,返回IEnumerable的属性与索引器之间存在差异。