将对象强制转换为值类型数组

时间:2013-04-30 09:56:23

标签: c# arrays boxing

我使用反射来读取对象的属性。

如果我读取的值是引用类型(例如String []),我可以将其转换为Object []数组并循环遍历数组中的字符串。

    String[] Workers = { "Steve", "Sally", "Jim" };
    Object SomeValue = Workers;
    // Prented that SomeValue is returned from reflection        
    List<Object> SomeList = new List<Object>((Object[])SomeValue);

但是,当对象是值类型的数组时,我无法将其重新转换为数组。我已经尝试了一切。 C#由于某种原因不会将其重新命名为ValueType数组(认为可能有效)。

    Int32[] WorkingHours = { 1, 2, 65, 6 };
    Object SomeValue = WorkingHours;
    // Prented that SomeValue is returned from reflection
    List<Object> SomeList = new List<Object>((ValueType[])SomeValue);

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

  

由于某种原因,C#不会将其重新命名为ValueType数组(认为可能会有效)。

不,它不起作用,因为表示不同。

协方差适用于引用类型数组的原因是引用的表示是相同的,无论它引用的对象的类型如何。如果比较值类型和引用类型,则

例如,考虑:

byte[] x = { 1, 2, 3, 4 };

x的每个元素只是一个字节。您无法将该数组视为object[] - 每个元素都不是参考。

但是,您可以通过装箱轻松转换每个元素并创建一个列表:

List<Object> list = ((IEnumerable) WorkingHours).Cast<Object>().ToList();