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

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

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

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

2 ответа

Решение

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

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 это не работает, потому что некоторые библиотеки не могут быть загружены.

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

Другие вопросы по тегам