2012-06-05 10 views
6

Voglio testare un oggetto per vedere se implementa IDictionary<TKey,TValue> ma non mi interessa cosa sono TKey e TValue.Verificare se un oggetto implementa un'interfaccia generica per qualsiasi tipo generico

posso testare se è un'istanza concreta del quadro Dictionary<,> in questo modo:

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

ma non riesco a pensare a un modo per testare qualcosa che implementa IDictionary<,>. Questa tecnica non funziona per l'interfaccia; IsAssignableFrom restituisce false se eseguo il test contro il tipo di base generico IDictionary<,>, che sembra strano poiché funziona per il tipo concreto.

Normalmente si utilizzerà is per verificare se qualcosa implementa un'interfaccia, ma ovviamente funziona solo se si desidera testare per un'interfaccia generica specifica. O semplicemente testerei per un'interfaccia ancestrale comune, ma a differenza di altre strutture di dati generici come IList<> e ICollection<>, non esiste un'interfaccia non generica unica da cui erediti il ​​generico IDictionary<TKey,TValue>.

risposta

10

ne dite qualcosa come

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

che sono sicuro che si può facilmente generalizzare per qualsiasi definizione di tipo generico.

+1

Mi piace. Come ho trascurato GetInterfaces? –

Problemi correlati