Beachten Sie, dass wenn Sie eine generische Schnittstelle IMyInterface
haben, dann wird dies immer false
zurückgeben:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* IMMER FALSCH */
Dies funktioniert auch nicht:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* IMMER FALSCH */
Wenn jedoch MyType
IMyInterface
implementiert, funktioniert dies und gibt true
zurück:
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
Sie werden jedoch wahrscheinlich den Typparameter T
zur Laufzeit nicht kennen. Eine etwas umständliche Lösung ist:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Jeffs Lösung ist etwas weniger umständlich:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Hier ist eine Erweiterungsmethode für Type
, die für jeden 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 das oben genannte Linq verwendet, was wahrscheinlich langsamer ist als eine Schleife.)
Sie können dann Folgendes tun:
typeof(MyType).IsImplementing(IMyInterface<>)