0

我正在使用反射从对象中读取属性。

如果我读取的值是引用类型(例如 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);

有什么建议么?

4

1 回答 1

4

C# 出于某种原因不会将其重新转换为 ValueType 数组(认为这可能会起作用)。

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

协变适用于引用类型数组的原因是引用的表示是相同的,无论它引用的对象类型如何。如果您比较值类型和引用类型,情况并非如此。

例如,考虑:

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

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

但是,您可以通过装箱相当轻松地转换每个元素并以这种方式创建一个列表:

List<Object> list = ((IEnumerable) WorkingHours).Cast<Object>().ToList();
于 2013-04-30T10:01:54.287 回答