Lưu ý rằng nếu bạn có một giao diện chung IMyInterface<T>
thì điều này sẽ luôn trả về false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
Điều này cũng không hoạt động:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
Tuy nhiên, nếu MyType
thực hiện IMyInterface<MyType>
điều này hoạt động và trả về true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
Tuy nhiên, bạn có thể sẽ không biết tham số loại T
khi chạy . Một giải pháp hơi khó là:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
Giải pháp của Jeff là một chút ít hacky:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
Đây là một phương pháp mở rộng trên Type
đó hoạt động cho mọi trường hợp:
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);
}
}
(Lưu ý rằng ở trên sử dụng linq, có thể chậm hơn vòng lặp.)
Sau đó bạn có thể làm:
typeof(MyType).IsImplementing(IMyInterface<>)