Beachten Sie, dass bei einer generischen Schnittstelle IMyInterface<T>
immer Folgendes zurückgegeben wird false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Das funktioniert auch nicht:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Wenn dies jedoch MyType
implementiert IMyInterface<MyType>
wird, funktioniert dies und gibt Folgendes zurück true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Wahrscheinlich kennen Sie den Typparameter T
zur Laufzeit jedoch nicht . Eine etwas hackige Lösung ist:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Jeffs Lösung ist etwas weniger hackig:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Hier ist eine Erweiterungsmethode Type
, die in jedem Fall funktioniert:
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);
}
}
(Beachten Sie, dass oben linq verwendet wird, das wahrscheinlich langsamer als eine Schleife ist.)
Sie können dann tun:
typeof(MyType).IsImplementing(IMyInterface<>)