Perhatikan bahwa jika Anda memiliki antarmuka generik IMyInterface<T>
maka ini akan selalu kembali false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Ini juga tidak bekerja:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Namun, jika MyType
mengimplementasikan IMyInterface<MyType>
ini berhasil dan mengembalikan true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Namun, Anda mungkin tidak akan tahu parameter tipe T
saat runtime . Solusi yang agak rumit adalah:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Solusi Jeff sedikit kurang rapi:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Berikut adalah metode ekstensi Type
yang berfungsi untuk kasus apa pun:
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);
}
}
(Perhatikan bahwa di atas menggunakan linq, yang mungkin lebih lambat dari satu loop.)
Anda kemudian dapat melakukan:
typeof(MyType).IsImplementing(IMyInterface<>)