Pour attaquer complètement le système de types, je pense que vous devez gérer la récursivité, par ex. IList<T>
: ICollection<T>
: IEnumerable<T>
, sans lequel vous ne sauriez pas que IList<int>
implémente finalement IEnumerable<>
.
/// <summary>Determines whether a type, like IList<int>, implements an open generic interface, like
/// IEnumerable<>. Note that this only checks against *interfaces*.</summary>
/// <param name="candidateType">The type to check.</param>
/// <param name="openGenericInterfaceType">The open generic type which it may impelement</param>
/// <returns>Whether the candidate type implements the open interface.</returns>
public static bool ImplementsOpenGenericInterface(this Type candidateType, Type openGenericInterfaceType)
{
Contract.Requires(candidateType != null);
Contract.Requires(openGenericInterfaceType != null);
return
candidateType.Equals(openGenericInterfaceType) ||
(candidateType.IsGenericType && candidateType.GetGenericTypeDefinition().Equals(openGenericInterfaceType)) ||
candidateType.GetInterfaces().Any(i => i.IsGenericType && i.ImplementsOpenGenericInterface(openGenericInterfaceType));
}
Ceci est une solution très élégante! Les autres que j'ai vu sur SO utilisent des boucles foreach ou des requêtes LINQ plus longues. Gardez à l'esprit que pour utiliser ceci, vous devez avoir .NET Framework 3.5. –
Je recommande que vous en fassiez une méthode d'extension à la http://bit.ly/ccza8B - nettoiera tout cela très bien! –
En fonction de vos besoins, vous devrez peut-être vous retrouver sur les interfaces renvoyées. –