.NET - Получение всех реализаций универсального интерфейса? - PullRequest
20 голосов
/ 01 мая 2011

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

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

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

Ответы [ 2 ]

21 голосов
/ 01 мая 2011

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

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

1 голос
/ 01 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...