Frage

Ich bin die Konstruktion eines Verfahrens in einem Arraylist nehmen (vermutlich voll von Objekten) und dann alle Felder Liste (und ihre Werte) für jedes Objekt in der Arraylist.

Zur Zeit ist mein Code wie folgt:

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

        }
    }

Natürlich verstehe ich das unmittelbare Problem mit diesem Code: wenn sie es nur ein Feld in der Arraylist pro Objekt drucken gearbeitet hat. Ich werde dies später beheben -. Im Moment bin ich nur gespannt, wie alle öffentlichen Felder mit einem Objekt verbunden bekommen

War es hilfreich?

Lösung

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

Beachten Sie, dass dieser Code erfordert .NET 3.5 zu arbeiten; -)

Andere Tipps

Sie können erhalten alle das Objekt Felder erklärten direkt in der Klasse mit dem Binding:

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

und alle Objektbereiche einschließlich geerbt mit:

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

Ich möchte erwähnen, dass in den Bereichen für IsPublic suchen nicht erforderlich ist, wie type.GetFields (), wie durch MSDN heißt es:

Rückgabewert - Typ: System.Reflection.FieldInfo []

Ein Array von Fieldinfo Objekte, die alle öffentliche Felder definiert für den aktuellen Typ.

Natürlich wäre eine andere Frage sein: „Warum haben Sie öffentliche Felder bekommen?“ - Eigenschaften bevorzugt sind. Als Abstraktion, beachten Sie, dass Reflexion ist nicht die einzige Option: Es ist auch möglich, für eine Art es ist Eigenschaften on-the-fly zur Laufzeit zu belichten (wie, wie eine nicht typisiert DataTable / DataView aussetzt Spalten als Eigenschaften)

.

Um dies zu unterstützen (während auch einfache Objekte unterstützt), würden Sie TypeDescriptor verwenden:

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

Auf diese Weise kann auch für zahlreiche Erweiterungsmöglichkeiten - zum Beispiel in beträchtlichem Ausmaß Beschleunigung der Reflexion (ohne Code zu ändern).

    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());
            }
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top