2011-06-22 7 views
20

Uso de la reflexión Tengo un objeto que debo convertir en una lista iterativa de elementos (escriba unknown, será objeto). Utilizando la ventana Mirar puedo ver que mi objeto es una matriz de algún tipo, ya que me dice la cantidad de elementos y puedo hacer estallar la vista en árbol para ver los elementos.Objeto C# para la matriz

En primer lugar, necesito comprobar que el objeto pasado es algún tipo de matriz (podría ser List, might be object [], etc.). Entonces necesito iterar a través de esa matriz. Sin embargo, no puedo hacer la conversión de tipo.

Así es como lo estoy usando (abreviado):

private static void Example(object instance, PropertyInfo propInfo) 
    { 
     object anArray = propInfo.GetValue(instance, null); 
     ArrayList myList = anArray as ArrayList; 
     foreach (object element in myList) 
     { 
      // etc 
     } 
    } 

He intentado varios moldes diferentes. Lo anterior no genera una excepción, pero mylist es nula cuando anArray realmente existe y contiene elementos. La instancia real que se guarda es una Lista fuertemente tipada <> pero podría tomar un subconjunto limitado de formularios si es necesario. Pero el objetivo del ejercicio es que este método de ejemplo() no conoce el tipo básico de la propiedad.

+0

puede averiguar el tipo de objeto a partir de instance.GetType() y que se puede comparar con el tipo desirebale usando 'is', por ejemplo, 'if (instance.GetType() es IEnumerable)' – Tsar

+1

@Bad Display Nombre que es ahora como funciona la palabra clave * is *, lo que está haciendo allí es intentar enviar desde System.Type a System.Collection.IEnumerable, which doesn No funciona porque System.Type no implementa esa interfaz. quizás quisiste decir ** typeof (IEnumerable) .IsAssignableFrom (instance.GetType()) ** – MattDavey

Respuesta

41

casting a un ArrayList sólo va a funcionar si el objeto es en realidad un ArrayList. No funcionará con System.Array o System.Collections.Generic.List`1, por ejemplo.

creo que lo que realmente debe hacer que se echa a IEnumerable, ya que ese es el único requisito para que un bucle sobre ...

object anArray = propInfo.GetValue(instance, null); 
IEnumerable enumerable = anArray as IEnumerable; 
if (enumerable != null) 
{ 
    foreach(object element in enumerable) 
    { 
     // etc... 
    } 
} 
+0

¡Guau, trabajo rápido y funciona! Gracias. – GeoffM

+1

Gracias a los demás también. – GeoffM

14

Intenta convertir a IEnumerable. Esta es la interfaz más básica que implementan todos los enumerables, matrices, listas, etc.

IEnumerable myList = anArray as IEnumerable; 
if (myList != null) 
{ 
    foreach (object element in myList) 
    { 
     // ... do something 
    } 
} 
else 
{ 
    // it's not an array, list, ... 
} 
1

Prueba esto:

var myList = anArray as IEnumerable; 
    if (mylist != null) 
    { 
     foreach (var element in myList) 
     { 
      // etc 
     } 
    } 

También podría necesita especificar el tipo genérico de IEnumerable, dependiendo de su situación.

1

Debería poder convertirlo a IEnumerable si se trata de una colección de cualquier tipo (matriz, lista, etc.). También PropertyInfo contiene una propiedad PropertyType que puede usar para averiguar el tipo real si lo desea.

1

simplemente puede hacer esto

string[] arr = ((IEnumerable)yourOjbect).Cast<object>() 
          .Select(x => x.ToString()) 
          .ToArray();