我有以下代码,我试图获得一个对象的所有属性以及属性值。有些属性可以是集合或集合的集合,所以我尝试为这些类型设置一个递归函数。不幸的是,它不能工作,在这一行出现错误
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();
}
我建议使用现有的序列化机制,如XML序列化或JSON序列化,来提供此信息,如果您试图使其通用。
听起来那个特定的属性是一个索引器,所以它期望您将索引值传递给GetValue方法。在一般情况下,没有简单的方法来获取索引器并确定哪些值可以作为有效的索引传递,因为类可以自由地实现索引器,但它想要。例如,以字符串为键的Dictionary有一个按键索引器,它可以在Keys属性中枚举索引。
序列化集合的典型方法是将它们作为一种特殊情况来处理,分别处理每种基本集合类型(数组、列表、字典等)。
请注意,这里返回IEnumerable的属性和返回indexer的属性是有区别的。