Genel bir arayüzünüz IMyInterface<T>
varsa, bunun her zaman geri döneceğini unutmayın false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Bu da çalışmaz:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Ancak, eğer MyType
uygular IMyInterface<MyType>
bu eserlerin ve iadeler true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Ancak, T
çalışma zamanında type parametresini bilemezsiniz . Biraz hileli bir çözüm:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Jeff'in çözümü biraz daha kibirli:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
İşte Type
her durumda çalışan bir uzantı yöntemi :
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);
}
}
(Yukarıda, muhtemelen bir döngüden daha yavaş olan linq kullandığını unutmayın.)
Daha sonra şunları yapabilirsiniz:
typeof(MyType).IsImplementing(IMyInterface<>)