Tengo una lista de objetos, de la cual no puedo saber el tipo de en tiempo de compilación.Cómo obtener la propiedad Count usando reflection para los tipos genéricos
Necesito identificar cualquiera de estos objetos donde existe una propiedad 'Contar', y obtener el valor si lo hace.
Este código funciona para este tipo sencillo de colección:
PropertyInfo countProperty = objectValue.GetType().GetProperty("Count");
if (countProperty != null)
{
int count = (int)countProperty.GetValue(objectValue, null);
}
El problema es que esto no funciona para los tipos genéricos, tales como IDictionary<TKey,TValue>
. En esos casos, el valor 'countProperty' se devuelve como nulo, aunque exista una propiedad 'Count' en el objeto instanciado.
Todo lo que quiero hacer es identificar cualquier colección/objeto basado en diccionario y encontrar su tamaño, si tiene uno.
Editar: conforme a lo solicitado, aquí está la lista completa de código que no funciona
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;
}
}
Esto funciona bien en colecciones simples, pero no en un objeto creado a partir de una clase que tengo que se deriva de Dictionary<TKey,TValue>
. Es decir
CustomClass :
Dictionary<TKey,TValue>
CacheItemInfo es sólo una clase simple que contiene propiedades para elementos de caché - es decir, llave, contar, tipo, de caducidad de fecha y hora
(pensando en términos de 'IDictionary 'no ayudará aquí, ya que' GetType() 'siempre devolverá el tipo * concrete *, que podría ser cualquier cosa, pero es más probable' Dictionary ') –
Aquí está el código como permanece - todavía no funciona. –
Así que la respuesta fue ignorar la reflexión y simplemente enviar a las interfaces; ver la respuesta correcta a continuación. –