将值类型数组转换为引用类型数组

时间:2016-04-27 17:15:33

标签: c# arrays object reflection covariance

我需要编写一个异常类,它接受一个消息和任何类型的信息对象(通常是匿名对象)。

我有以下代码:

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关键字 - 会遇到与上述代码相同的问题
  • 使用dynamic和Newtonsoft JSON序列化为JSON - 不希望依赖第三方库(或Web DLL)

我假设有一种优雅的方式(可能使用反射)来实现这一点,也许通过某种方式迭代数组。有人可以提出解决方案吗?

1 个答案:

答案 0 :(得分:1)

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

((IEnumerable)value).Cast<object>()