Ich habe eine Liste von Objekten, von denen ich den Typ zur Kompilierzeit nicht kennen kann.
Ich muss eines dieser Objekte identifizieren, für das eine 'Count'-Eigenschaft existiert, und den Wert erhalten, falls dies der Fall ist.
Dieser Code funktioniert für einfache Collection-Typen:
%Vor% Das Problem besteht darin, dass dies für generische Typen wie IDictionary<TKey,TValue>
nicht funktioniert. In diesen Fällen wird der Wert "countProperty" als null zurückgegeben, obwohl im instanzierten Objekt eine Eigenschaft "Count" vorhanden ist.
Alles, was ich tun möchte, ist, jedes Objekt auf der Basis von Sammlungen / Wörterbüchern zu identifizieren und dessen Größe zu ermitteln, falls es eines hat.
Bearbeiten: Wie gewünscht, hier ist die gesamte Auflistung von Code, der nicht funktioniert
%Vor% Dies funktioniert bei einfachen Sammlungen, aber nicht bei einem Objekt, das aus einer Klasse erstellt wurde, die von Dictionary<TKey,TValue>
abgeleitet ist. Dh
CacheItemInfo ist nur eine einfache Klasse, die Eigenschaften für Cache-Elemente enthält - dh Schlüssel, Anzahl, Typ, Ablaufdatum-Zeit
Das erste, was Sie ausprobieren sollten, ist das Casting auf ICollection
, da dies ein sehr günstiges .Count
ist:
Das Count
für Dictionary sollte funktionieren - ich habe das mit Dictionary<,>
getestet und es funktioniert gut - aber beachte, dass selbst wenn etwas IDictionary<,>
implementiert, der konkrete -Typ (wird zurückgegeben) via GetType()
) muss nicht ein .Count
in der öffentlichen API haben - es könnte explizite Schnittstellenimplementierung verwenden, um die Schnittstelle zu erfüllen, während nicht public int Count {get;}
. Wie ich schon sagte: Es funktioniert für Dictionary<,>
- aber nicht unbedingt für jeden Typ.
Als letzte Anstrengung, wenn alles andere fehlschlägt:
%Vor% Bearbeiten, um in die in Kommentaren aufgeworfene Dictionary<,>
Frage zu sehen:
Tags und Links c# reflection