Рассмотрим общий интерфейс
public interface IA<T>
{
}
и две реализации
public class A1 : IA<string>
{}
public class A2 : IA<int>
{}
Я хочу написать метод, который найдет классы, которые реализуют интерфейс IA
с определенным типом
public Type[] Find(IEnumerable<Type> types, Type type)
так что следующий вызов
Find(new List<Type>{ typeof(A1), typeof(A2)}, typeof(string))
вернет тип A1
ВАЖНАЯ ЗАМЕТКА
Я могу предположить, что все типы, переданные в виде списка, будут реализовывать IA
но не обязательно напрямую (например, A1
может наследовать от BaseA
который реализует IA<string>
)
Как я могу это сделать через отражение?
Используйте MakeGenericType
для создания определенного общего типа и проверьте, доступен ли он в списке интерфейсов, которые реализует данный класс.
private static Type FindImplementation(IEnumerable<Type> implementations, Type expectedTypeParameter)
{
Type genericIaType = typeof(IA<>).MakeGenericType(expectedTypeParameter);
return implementations.FirstOrDefault(x => x.GetInterfaces().Contains(genericIaType));
}
И вы называете это так
Type type = FindImplementation(new []{ typeof(A1), typeof(A2)}, typeof(string));
//Returns A1
MakeGenericType
был действительно недостающим элементом для меня. Спасибо!