Pamiętaj, że jeśli masz ogólny interfejs, IMyInterface<T>
to zawsze zwróci false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
To też nie działa:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Jeśli jednak MyType
implementuje IMyInterface<MyType>
to działa i zwraca true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Prawdopodobnie jednak nie będziesz znać parametru typu T
w czasie wykonywania . Nieco hackerskim rozwiązaniem jest:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Rozwiązanie Jeffa jest nieco mniej hackerskie:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Oto metoda rozszerzenia, Type
która działa w każdym przypadku:
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);
}
}
(Zauważ, że powyższe używa linq, który prawdopodobnie jest wolniejszy niż pętla.)
Następnie możesz wykonać:
typeof(MyType).IsImplementing(IMyInterface<>)