2012-05-21 14 views
9

que tienen una función COM que espera object[] como parámetro:¿Cómo convertir de System.array a Object [] en C#

foo(object[] values) 

quiero pasar algunos campos enum a él, así que utilice el siguiente :

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

Sin embargo, cuando intento pasar fields-foo(...) es decir [foo(fields)] consigo un error:

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

¿Alguien puede decirme qué estoy haciendo mal?

Respuesta

20

Como dice la excepción, no puede convertir un molde SomeEnumType[] en object[] - el primero es una matriz donde cada valor es un valor SomeEnumType; el último es una matriz donde cada elemento es una referencia.

Con LINQ se puede crear una matriz nueva con bastante facilidad:

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

Esto básicamente se casilla cada elemento (cada valor de enumeración) para crear un IEnumerable<object>, a continuación, crear una matriz de eso. Es similar al enfoque de Tilak, pero prefiero usar Cast cuando en realidad no necesito una proyección de propósito general.

Alternativamente:

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

Debe moldear el tipo de matriz adecuado. Pruebe algo como lo siguiente:

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

mensaje El error se indica que la función está esperando una matriz objeto de tipo "objeto" y que está pasando por uno de tipo "SomeEnumType", por lo que existe una coincidencia de tipos .

+0

hecho. Como Developer insinúa, Array es un objeto, no una matriz C++ style []. – user978122

+0

Cierto, vengo de un fondo de C++: los viejos hábitos mueren duro :) –

4
Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray() 
+0

Enum.GetValues ​​(...) devuelve System.Array, no hay una extensión Select (...) ... –

+0

Gracias. Me perdí el reparto en el medio. – Tilak

Cuestiones relacionadas