Observe que se você tiver uma interface genérica IMyInterface<T>
, ela sempre retornará false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Isso também não funciona:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
No entanto, se MyType
implementar IMyInterface<MyType>
isso funciona e retorna true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
No entanto, você provavelmente não saberá o parâmetro type T
em tempo de execução . Uma solução um pouco hacky é:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
A solução de Jeff é um pouco menos invasiva:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Aqui está um método de extensão Type
que funciona para qualquer caso:
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);
}
}
(Observe que o acima usa linq, que é provavelmente mais lento que um loop.)
Você pode então fazer:
typeof(MyType).IsImplementing(IMyInterface<>)