2012-06-05 18 views
6

Quiero probar un objeto para ver si implementa IDictionary<TKey,TValue>, pero no me importa qué TKey y TValue sean.Pruebe si un objeto implementa una interfaz genérica para cualquier tipo genérico

puedo probar si es una instancia concreta del marco Dictionary<,> así:

bool isDict = type.IsGenericType && 
    (typeof(Dictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition()); 

pero no puedo pensar en una manera de probar algo que implementa IDictionary<,>. Esta técnica no funciona para la interfaz; IsAssignableFrom devuelve falso si pruebo contra el tipo base genérico IDictionary<,>, que parece extraño ya que funciona para el tipo concreto.

Normalmente usaría is para probar si algo implementa una interfaz, pero por supuesto esto solo funciona si quiero probar una interfaz genérica específica. O simplemente probaría una interfaz ancestral común, pero a diferencia de otras estructuras de datos genéricos como IList<> y ICollection<>, no existe una interfaz única no genérica de la que hereda el genérico IDictionary<TKey,TValue>.

Respuesta

10

¿Qué tal algo así como

return type.GetInterfaces() 
      .Where(t => t.IsGenericType) 
      .Select(t => t.GetGenericTypeDefinition()) 
      .Any(t => t.Equals(typeof(IDictionary<,>))); 

que estoy seguro de que se puede generalizar fácilmente para cualquier definición de tipo genérico.

+1

Me gusta. ¿Cómo pasé por alto GetInterfaces? –

Cuestiones relacionadas