Question

Je construis une méthode pour intégrer une liste de tableaux (probablement pleine d'objets), puis répertorier tous les champs (et leurs valeurs) pour chaque objet de la liste de tableaux.

Actuellement, mon code est le suivant:

public static void ListArrayListMembers(ArrayList list)
    {
        foreach (Object obj in list)
        {
            Type type = obj.GetType();
            string field = type.GetFields().ToString();
            Console.WriteLine(field);

        }
    }

Bien sûr, je comprends le problème immédiat de ce code: s’il fonctionnait correctement, il n’imprimerait qu’un seul champ par objet dans ArrayList. Je résoudrai cela plus tard. En ce moment, je suis juste curieux de savoir comment obtenir tous les champs publics associés à un objet.

Était-ce utile?

La solution

foreach (Object obj in list) {
    Type type = obj.GetType();

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) {
        Console.WriteLine(
            String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj));
    }                           
}

Notez que ce code nécessite .NET 3.5 pour fonctionner; -)

Autres conseils

Vous pouvez obtenir tous les champs d'objet déclarés directement dans la classe avec les BindingFlags:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)

et tous les champs d'objet, y compris ceux hérités avec:

GetFields(BindingFlags.Public | BindingFlags.Instance)
public static void ListArrayListMembers(ArrayList list)
{
    foreach (Object obj in list)
    {
        Type type = obj.GetType();
        Console.WriteLine("{0} -- ", type.Name);
        Console.WriteLine(" Properties: ");
        foreach (PropertyInfo prop in type.GetProperties())
        {
            Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
                prop.Name, prop.GetValue(obj, null));
        }
        Console.WriteLine(" Fields: ");
        foreach (FieldInfo field in type.GetFields())
        {
            Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
                field.Name, field.GetValue(obj));
        }
    }
}

J'aimerais mentionner que la recherche de IsPublic dans les champs n'est pas nécessaire car type.GetFields () tel que défini par MSDN indique:

Valeur de retour - Type: System.Reflection.FieldInfo []

Tableau d'objets FieldInfo représentant tous les champs publics définis pour le Type actuel.

Bien sûr, une autre question serait "Pourquoi avez-vous des champs publics?" - les propriétés étant préférables. En tant qu'abstraction, notez que la réflexion n'est pas la seule option: il est également possible pour un type d'exposer ses propriétés à la volée au moment de l'exécution (comme comment un DataTable non typé / DataView expose les colonnes en tant que propriétés).

Pour prendre en charge cette fonctionnalité (tout en prenant en charge des objets simples), vous devez utiliser TypeDescriptor :

.
        foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
        {
            Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
        }

Cela permet également de nombreuses options d'extensibilité - par exemple, accélérer la réflexion (sans changer le code).

    static void ListArrayListMembers(ArrayList list)
    {
        foreach (object obj in list)
        {
            Type type = obj.GetType();
            foreach (FieldInfo field in type.GetFields(BindingFlags.Public))
            {
                Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString());
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top