Вопрос по c#, .net, c#-4.0 – Как мне конвертировать из System.Array в объект [] в C #

15

У меня есть функция COM, которая ожидаетobject[] в качестве параметра:

foo(object[] values)

Я хочу передать некоторыеenum поля к нему, поэтому я использую следующее:

object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType));

Тем не менее, когда я пытаюсь пройтиfields вfoo(...) то есть [foo(fields)] Я получаю ошибку:

"Unable to cast object of type `SomeEnumType[]' to type 'system.Object[]'.

Может кто-нибудь сказать мне, что я делаю не так?

Ваш Ответ

3   ответа
24

SomeEnumType[] вobject[] - первый массив, где каждое значениеSomeEnumType значение; последний является массивом, где каждый элемент является ссылкой.

С LINQ вы можете создатьnew массив достаточно легко:

object[] fields = Enum.GetValues(typeof(SomeEnumType))
                      .Cast<object>()
                      .ToArray();

Это будет в основном упаковывать каждый элемент (каждое значение перечисления), чтобы создатьIEnumerable<object>, а затем создать массив из этого. Это похоже на подход Тилака, но я предпочитаю использоватьCast когда мне на самом деле не нужна проекция общего назначения.

В качестве альтернативы:

SomeEnumType[] values = (SomeEnumType[]) Enum.GetValues(typeof(SomeEnumType));
object[] fields = Array.ConvertAll(values, x => (object) x);
2

в этом духе:

object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray();

В сообщении об ошибке указывается, что функция ожидает массив объектов типа & quot; объект & quot; и вы переходите к одному из типов "SomeEnumType", поэтому существует несоответствие типов.

Error: User Rate Limit Exceeded Pat Mustard
Error: User Rate Limit Exceeded
4
Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray()
Enum.GetValues (...) возвращает System.Array, расширение Select (...) отсутствует ...
... а потом вы просто превратили его в ответ Джона Скита без объяснения причин.
Благодарю. я пропустил актерский состав.

Похожие вопросы