Ich habe eine Klasse, die mehrere Eigenschaften enthält (alle sind Zeichenfolgen, wenn es einen Unterschied macht).
Ich habe auch eine Liste, die viele verschiedene Instanzen der Klasse enthält.
Während ich einige Komponententests für meine Klassen erstellte, entschied ich, dass ich jedes Objekt in der Liste durchlaufen und dann jede Eigenschaft dieses Objekts durchlaufen wollte ...
Ich dachte, das wäre so einfach wie ...
foreach (Object obj in theList)
{
foreach (Property theProperties in obj)
{
do some stufff!!;
}
}
Aber das hat nicht funktioniert! :( Ich bekomme diesen Fehler ...
"foreach-Anweisung kann nicht mit Variablen vom Typ 'Application.Object' arbeiten, da 'Application.Object' keine öffentliche Definition für 'GetEnumerator' enthält."
Kennt jemand einen Weg, dies ohne jede Menge Wenn und Schleifen zu tun oder ohne auf etwas zu Komplexes einzugehen?
quelle
Antworten:
Probieren Sie es aus:
Beachten Sie auch, dass
Type.GetProperties()
es eine Überladung gibt, die eine Reihe von Bindungsflags akzeptiert, sodass Sie Eigenschaften nach anderen Kriterien wie der Barrierefreiheit herausfiltern können. Weitere Informationen finden Sie unter MSDN: Type.GetProperties-Methode (BindingFlags) Vergessen Sie nicht, dies zu vergessen Fügen Sie die Assemblyreferenz "system.Reflection" hinzu.Zum Beispiel, um alle öffentlichen Eigenschaften aufzulösen:
Bitte lassen Sie mich wissen, ob dies wie erwartet funktioniert.
quelle
Sie können alle nicht indizierten Eigenschaften eines Objekts wie folgt durchlaufen:
Da
GetProperties()
kehrt Indexer sowie einfache Eigenschaften, benötigen Sie einen zusätzlichen Filter vor dem AufrufGetValue
zu wissen , dass es sicher ist , passierennull
als zweiten Parameter.Möglicherweise müssen Sie den Filter weiter modifizieren, um schreibgeschützte und ansonsten unzugängliche Eigenschaften auszusortieren.
quelle
null
Getter stößt , aber ich bin sicher, dass OP herausfinden wird, wie nur die Eigenschaften abgerufen werden, die er benötigt.Sie sind fast da, Sie müssen nur die Eigenschaften des Typs abrufen, anstatt zu erwarten, dass die Eigenschaften in Form einer Sammlung oder einer Eigenschaftstasche zugänglich sind:
Von dort aus können Sie wie folgt zugreifen :
Mit
GetValue
dem zweiten Parameter können Sie Indexwerte angeben, die mit Eigenschaften funktionieren, die Sammlungen zurückgeben. Da eine Zeichenfolge eine Sammlung von Zeichen ist, können Sie auch einen Index angeben, um bei Bedarf ein Zeichen zurückzugeben.quelle
Sicher kein Problem:
quelle
if (item == null) continue;
Ich persönlich denke, wenn Sie zu diesem Zeitpunkt ein Null-Objekt haben, ist viel früher etwas schiefgegangen, und dort sollte die Validierung sein, oder irre ich mich?Verwenden Sie dazu Reflection
quelle
Ein kleines Wort der Vorsicht: Wenn "einige Dinge tun" bedeutet, den Wert der tatsächlich besuchten Eigenschaft zu aktualisieren, UND wenn sich auf dem Pfad vom Stammobjekt zur besuchten Eigenschaft eine Eigenschaft vom Typ Struktur befindet, wird die Änderung, die Sie an der Eigenschaft vorgenommen haben, geändert nicht auf dem Stammobjekt reflektiert werden.
quelle
Ich konnte keine der oben genannten Arbeitsmethoden finden, aber das hat funktioniert. Der Benutzername und das Kennwort für DirectoryEntry sind optional.
quelle
Eine Copy-Paste-Lösung (Erweiterungsmethoden), die hauptsächlich auf früheren Antworten auf diese Frage basiert.
Behandelt auch IDicitonary (ExpandoObject / dynamic) richtig, was häufig benötigt wird, wenn mit diesen reflektierten Dingen umgegangen wird.
Nicht empfohlen für enge Schleifen und andere heiße Pfade. In diesen Fällen benötigen Sie eine Caching- / IL-Emit- / Ausdrucksbaumkompilierung.
quelle
Ich habe auf dieser Seite nach der Antwort auf eine ähnliche Frage gesucht. Ich habe die Antworten auf mehrere ähnliche Fragen geschrieben, die Personen helfen können, die diese Seite betreten.
Klassenliste
Die Klasse List <T> repräsentiert die Liste der Objekte, auf die über den Index zugegriffen werden kann. Es fällt unter den System.Collection.Generic-Namespace. Die Listenklasse kann verwendet werden, um eine Sammlung verschiedener Typen wie Ganzzahlen, Zeichenfolgen usw. zu erstellen. Die Listenklasse bietet auch die Methoden zum Suchen, Sortieren und Bearbeiten von Listen.
Klasse mit Eigentum :
ODER Klasse mit Feld :
ODER, Liste der Objekte (ohne dieselben Zellen):
ODER, Liste der Objekte (Sie müssen dieselben Zellen haben):
ODER Liste der Objekte (mit Schlüssel):
ODER Liste des Wörterbuchs
Viel Glück..
quelle