Вернуть объект обратно в массив типов значений

Я использую отражение для чтения свойств объекта.

Если значение, которое я читаю, является ссылочным типом (например, 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);

Однако, когда объект представляет собой массив типов значений, я не могу преобразовать его в массив. Я пробовал все. С# по какой-то причине не преобразует его в массив 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);

Какие-либо предложения?


person David Homer    schedule 30.04.2013    source источник
comment
ты пробовал (IEnumerable<object>)SomeValue?   -  person Damith    schedule 30.04.2013


Ответы (1)


С# по какой-то причине не преобразует его в массив ValueType (думал, что это, вероятно, сработает).

Нет, это не сработает, потому что представление другое.

Причина, по которой ковариация работает для массивов ссылочных типов, заключается в том, что представление ссылки одинаково независимо от типа объекта, на который она ссылается. Это не при сравнении типов значений и ссылочных типов.

Например, рассмотрим:

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

Каждый элемент x представляет собой просто байт. Вы не можете просмотреть этот массив как object[] — каждый элемент просто не является ссылкой.

Однако вы можете довольно легко преобразовать каждый элемент с помощью бокса и таким образом создать список:

List<Object> list = ((IEnumerable) WorkingHours).Cast<Object>().ToList();
person Jon Skeet    schedule 30.04.2013
comment
Отлично - это то, что я искал, но не мог понять, спасибо! - person David Homer; 30.04.2013