I have a list of objects from which I cannot know the type at compile time.
I need to identify any of these objects where the Count property exists and get the value, if any.
This code works for simple Collection types:
PropertyInfo countProperty = objectValue.GetType().GetProperty("Count"); if (countProperty != null) { int count = (int)countProperty.GetValue(objectValue, null); }
The problem is that this does not work for generic types like IDictionary<TKey,TValue> . In these cases, the value "countProperty" is returned as null, although the property "Count" exists in the instanced object.
All I want to do is identify any object based on the collection / dictionary and find its size, if any.
Edit: on request here is a complete list of code that doesn't work
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; } }
This works fine in simple collections, but not on an object created from class I, which is derived from Dictionary<TKey,TValue> . Those.
CustomClass : Dictionary<TKey,TValue>
CacheItemInfo is just a class that contains properties for cache elements, i.e. key, counter, type, expiration date
reflection c #
Bruce chapman
source share