найти тип, реализующий универсальный интерфейс через отражение

1

Рассмотрим общий интерфейс

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>)

Как я могу это сделать через отражение?

Теги:
reflection

1 ответ

2
Лучший ответ

Используйте 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
  • 0
    MakeGenericType был действительно недостающим элементом для меня. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню