Зауважте, що якщо у вас є загальний інтерфейс, 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<>)