2015-03-29 5 views
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>)

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

ответ

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' действительно отсутствует часть для меня. Благодаря! –

Смежные вопросы