โปรดทราบว่าหากคุณมีอินเทอร์เฟซทั่วไป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<>)