Ermitteln der Count-Eigenschaft mithilfe der Reflektion für generische Typen

8

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

%Vor%

CacheItemInfo ist nur eine einfache Klasse, die Eigenschaften für Cache-Elemente enthält - dh Schlüssel, Anzahl, Typ, Ablaufdatum-Zeit

    
Bruce Chapman 06.01.2011, 07:05
quelle

2 Antworten

11

Das erste, was Sie ausprobieren sollten, ist das Casting auf ICollection , da dies ein sehr günstiges .Count ist:

%Vor%

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 mit 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:

%Vor%     
Marc Gravell 06.01.2011, 07:13
quelle
1

Wie wäre es, wenn Sie dies nach Ihrer ersten Prüfung hinzufügen (! ungetestet!) ...

%Vor%     
yoyo 12.01.2011 09:38
quelle

Tags und Links