2016-04-27 324 views
0

我需要编写一个异常类,它接受任何类型的消息和信息对象(通常为匿名对象)。将值类型数组转换为引用类型数组

我有以下代码:

public SpecialException(string message, object info) : this(message) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(info.GetType())) 
    { 
     object value = property.GetValue(info); 
     string valueStr = value.GetType().IsArray ? (value as IEnumerable<object>).Select(x => x.ToString()).Aggregate((x, y) => $"{x}, {y}") : value.ToString(); 
     sb.AppendLine($"{property.Name} = {valueStr}"); 
    } 
    Info = sb.ToString(); 
} 

问题是,这种代码不会当匿名对象的属性之一是值类型项目的数组,因为它们不继承对象,这种类型的工作协方差不能与他们一起工作。

我试了一下,却发现要么没有工作或不雅:

  • 使用Dictionary<string, object> - 无法覆盖Add方法
  • 使用IDictionary<string, object>界面 - 不想实现所有的接口方法一个简单的例外
  • 使用ExpandoObjectdynamic关键字 - 将遇到与上面的代码相同的问题
  • 使用0序列化为JSON和Newtonsoft JSON - 不想在第三方库扶养(或Web DLL)

我认为有实现这个优雅的方式(可能使用反射),也许通过某种方式迭代阵列。任何人都可以提出解决方案

+2

'(价值为IEnumerable )' - >'(价值为IEnumerable).Cast ()' – PetSerAl

+1

值类型实际上已继承'object' –

+0

它是如何不工作?你是否遇到异常? –

回答

1

差异不适用于值类型。因此,值类型数组不能被转换为IEnumerable<object>,但它仍然可以被转换为非通用IEnumerable接口。之后您可以拨打Cast<object>()扩展方法获得IEnumerable<object>实例。

((IEnumerable)value).Cast<object>() 
相关问题