Notez que si vous avez une interface générique, IMyInterface<T>
cela retournera toujours false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Cela ne fonctionne pas non plus:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Cependant, si MyType
implémente IMyInterface<MyType>
cela fonctionne et retourne true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Cependant, vous ne connaîtrez probablement pas le paramètre de type T
lors de l'exécution . Une solution quelque peu hacky est:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
La solution de Jeff est un peu moins hacky:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Voici une méthode d'extension Type
qui fonctionne dans tous les cas:
public static class TypeExtensions
{
public static bool IsImplementing(this Type type, Type someInterface)
{
return type.GetInterfaces()
.Any(i => i == someInterface
|| i.IsGenericType
&& i.GetGenericTypeDefinition() == someInterface);
}
}
(Notez que ce qui précède utilise linq, qui est probablement plus lent qu'une boucle.)
Vous pouvez alors faire:
typeof(MyType).IsImplementing(IMyInterface<>)