Подтвердить что ты не робот

.NET - Получение всех реализаций общего интерфейса?

Ответ на Реализации интерфейса через Reflection" показывает, как получить все реализации интерфейса. Однако, учитывая общий интерфейс IInterface<T>, следующее не работает:

var types = TypesImplementingInterface(typeof(IInterface<>))

Может кто-нибудь объяснить, как я могу изменить этот метод?

4b9b3361

Ответ 1

Вы можете использовать что-то вроде этого:

public static bool DoesTypeSupportInterface(Type type, Type inter)
{
    if(inter.IsAssignableFrom(type))
        return true;
    if(type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == inter))
        return true;
    return false;
}

public static IEnumerable<Type> TypesImplementingInterface(Type desiredType)
{
    return AppDomain
        .CurrentDomain
        .GetAssemblies()
        .SelectMany(assembly => assembly.GetTypes())
        .Where(type => DoesTypeSupportInterface(type, desiredType));

}

Он может выбросить TypeLoadException, но это проблема, уже присутствующая в исходном коде. Например, в LINQPad это не работает, потому что некоторые библиотеки не могут быть загружены.

Ответ 2

Это не работает, потому что IInterface<object> (используя System.Object для T в качестве примера) не наследуется от "открытого" общего типа IInterface<>. "Закрытый" общий тип является корневым типом, как и IFoo. Вы можете искать только закрытые родовые типы, а не открытые, то есть вы можете найти все, что наследуется от IInterface<int>. IFoo не имеет базового класса, а не IInterface<object> или IInterface<string> и т.д.