2011-01-08 14 views
10

¿Cómo puedo convertir un object en IEnumerable<object>?¿Objeto de fundición a IEnumerable <object>?

Sé que el objeto implementa IEnumerable<object> pero no sé de qué tipo es. Podría ser una matriz, List<T>, o lo que sea.


Un caso de prueba sencilla que estoy tratando de conseguir trabajo:

static void Main(string[] args) 
{ 
    object arr = new[] { 1, 2, 3, 4, 5 }; 
    foreach (var item in arr as IEnumerable<object>) 
     Console.WriteLine(item); 
    Console.ReadLine(); 
} 
+0

¿Qué quieres hacer con él? ¿Puede darnos un ejemplo? – Ani

+0

@Ani: Tengo un diccionario que contiene un grupo de objetos de tipos mixtos. Algunos de ellos son enumerables. Estoy intentando descubrir cómo puedo recorrer esos sin saber su tipo exacto. – mpen

Respuesta

15

Es difícil responder a esta sin un caso de uso concreto, pero que puede resultará suficiente para poner simplemente la interfaz no genérica IEnumerable.

Hay dos razones por las que esto normalmente funcionará para la mayoría de los tipos que se consideran "secuencias".

  1. Las clases de colección ".NET" .NET 1.x implementan IEnumerable.
  2. El IEnumerable<T> interfaz genérica hereda de IEnumerable, por lo que el yeso debe funcionar bien para las clases de colección genéricos en System.Collections.Generic, secuencias de LINQ etc.

EDIT:

cuanto a por qué la muestra provista no funciona:

  1. Esto no funcionaría en C# 3 porque no es compatible con la covarianza de interfaz genérica - no se puede ver un IEnumerable<Derived> como IEnumerable<Base>.
  2. Esto no quiere trabajar en C# 4 o bien a pesar de que es IEnumerable<T> covariante, ya que la varianza no es compatible con tipos de valor - el reparto de int[] (un IEnumerable<int>) ->IEnumerable<object> puede no tener éxito .
+0

Oh ... pensé que tenía que ser 'IEnumerable '. Si esto funciona, ¿por qué no funcionaría 'IEnumerable ' ... espere ... no importa. Porque es 'IEnumerable ' que es bastante diferente. Ya lo veo. Gracias Ani! – mpen

+0

IEnumerable implementa IEnumerable por lo que siempre puede lanzar "hacia abajo" –

+1

@Pauli: sí, pero el problema que estaba experimentando era que 'int []' no implementa 'IEnumerable ' en absoluto ... solo 'IEnumerable ' que no es lo mismo Pero simplemente 'IEnumerable' hace el truco. – mpen

14

me encontré con el mismo problema con covarianza no apoyar los tipos de valor, que tenía una object con y el tipo real de List<Guid> y necesitaba un IEnumerable<object>. Una forma de generar un IEnumerable cuando solo IEnumerable no es lo suficientemente bueno es usar el método linq Cast

((IEnumerable)lhsValue).Cast<object>() 
Cuestiones relacionadas