Ich habe eine Liste von Objekten, von denen ich den Typ von zur Kompilierzeit nicht kennen kann.So erhalten Sie die Count-Eigenschaft mit Reflektion für generische Typen
Ich muss eines dieser Objekte identifizieren, wo eine "Count" -Eigenschaft vorhanden ist, und den Wert erhalten, wenn dies der Fall ist.
Dieser Code funktioniert für einfache Art der Sammlung:
PropertyInfo countProperty = objectValue.GetType().GetProperty("Count");
if (countProperty != null)
{
int count = (int)countProperty.GetValue(objectValue, null);
}
Das Problem ist, dass dies nicht für generische Typen funktioniert, wie IDictionary<TKey,TValue>
. 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 jede Sammlung/Dictionary-basierten Objekt identifizieren und finden Sie die Größe, wenn es eine hat.
Edit: wie gewünscht, hier ist die gesamte Auflistung der Code, der nicht
private static void GetCacheCollectionValues(ref CacheItemInfo item, object cacheItemValue)
{
try
{
//look for a count property using reflection
PropertyInfo countProperty = cacheItemValue.GetType().GetProperty("Count");
if (countProperty != null)
{
int count = (int)countProperty.GetValue(cacheItemValue, null);
item.Count = count;
}
else
{
//poke around for a 'values' property
PropertyInfo valuesProperty = cacheItemValue.GetType().GetProperty("Values");
int valuesCount = -1;
if (valuesProperty != null)
{
object values = valuesProperty.GetValue(cacheItemValue, null);
if (values != null)
{
PropertyInfo valuesCountProperty = values.GetType().GetProperty("Count");
if (countProperty != null)
{
valuesCount = (int)valuesCountProperty.GetValue(cacheItemValue, null);
}
}
}
if (valuesCount > -1)
item.Count = valuesCount;
else
item.Count = -1;
}
}
catch (Exception ex)
{
item.Count = -1;
item.Message = "Exception on 'Count':" + ex.Message;
}
}
Dies funktioniert OK auf einfache Sammlungen funktioniert, aber nicht auf ein Objekt aus einer Klasse habe ich geschaffen, die von Dictionary<TKey,TValue>
stammt . Dh
CustomClass :
Dictionary<TKey,TValue>
CacheItemInfo ist nur eine einfache Klasse, die Eigenschaften für die Cache-Elemente enthält - dh Schlüssel, Anzahl, Art, Ablaufdatumzeit
(Denken in Begriffen von IDictionary 'wird hier nicht helfen, da' GetType() 'immer den * konkreten * Typ zurückgibt, der alles sein könnte, aber ist am wahrscheinlichsten' Dictionary –
Hier ist der Code als Es steht - funktioniert immer noch nicht. –
Also war die Antwort, Reflexion zu ignorieren und nur auf Schnittstellen zu werfen - siehe richtige Antwort unten. –