web-dev-qa-db-fra.com

Objet C # au tableau

En utilisant la réflexion, j'ai un objet que je dois intégrer dans une liste d'itérations (type inconnu, sera objet). En utilisant la fenêtre Watch, je peux voir que mon objet est un tableau d'un certain type car il me dit le nombre d'éléments et je peux exploser l'arborescence pour voir les éléments eux-mêmes.

Tout d'abord, je dois vérifier que l'objet transmis est une sorte de tableau (peut être List, object [], etc.). Ensuite, je dois parcourir ce tableau. Cependant, je ne peux pas faire la conversion de type.

Voici comment je l'utilise (en abrégé):

    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
        }
    }

J'ai essayé différents modèles. Ce qui précède ne déclenche pas d'exception, mais mylist est null quand un tableau existe réellement et contient des éléments. L'instance réelle en cours d'enregistrement est une liste fortement typée <> mais peut prendre un sous-ensemble limité de formulaires si nécessaire. Mais le point de l'exercice est que cette méthode Example () ne connaît pas le type de base de la propriété.

23
GeoffM

Le caster dans une ArrayList ne fonctionnera que si l'objet est une ArrayList. Il ne fonctionnera pas avec un System.Array ou un System.Collections.Generic.List`1 par exemple.

Je pense que ce que vous devez réellement faire est de le lancer sur IEnumerable, car c'est votre seule exigence pour le parcourir ...

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

Essayez de convertir en IEnumerable. Il s'agit de l'interface la plus basique que tous les énumérables, tableaux, listes, etc. implémentent.

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

Essayez simplement ceci

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

Essaye ça:

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

Vous devrez peut-être également spécifier le type générique de IEnumerable, selon votre situation.

1
Rik

Vous devriez pouvoir le convertir en IEnumerable s'il s'agit d'une collection de toutes sortes (tableau, liste, etc.). PropertyInfo contient également une propriété PropertyType que vous pouvez utiliser pour découvrir le type réel si vous le souhaitez.

1
ChrisWue