.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>
и т.п.