Обратите внимание, что если у вас есть универсальный интерфейс, IMyInterface<T>
он всегда будет возвращать false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Это тоже не работает:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Однако, если MyType
реализует IMyInterface<MyType>
это работает и возвращает true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Однако вы, вероятно, не будете знать параметр типа T
во время выполнения . Несколько хакерское решение:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Решение Джеффа немного менее хакерское:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Вот метод расширения, Type
который работает для любого случая:
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);
}
}
(Обратите внимание, что выше используется linq, который, вероятно, медленнее, чем цикл.)
Затем вы можете сделать:
typeof(MyType).IsImplementing(IMyInterface<>)