2009-07-17 7 views
24

У меня есть общий интерфейс, скажем, IGeneric. Для данного типа я хочу найти общие аргументы, которые класс выполняет через IGeneric.Получение аргументов типа общих интерфейсов, которые реализует класс

Это более ясно, в этом примере:

Class MyClass : IGeneric<Employee>, IGeneric<Company>, IDontWantThis<EvilType> { ... } 

Type t = typeof(MyClass); 
Type[] typeArgs = GetTypeArgsOfInterfacesOf(t); 

// At this point, typeArgs must be equal to { typeof(Employee), typeof(Company) } 

Что является реализация GetTypeArgsOfInterfacesOf (тип Т)?

Примечание. Можно предположить, что метод GetTypeArgsOfInterfacesOf написан специально для IGeneric.

Редактировать: Обратите внимание, что я специально спрашиваю, как отфильтровать IGeneric интерфейс со всех интерфейсов, которые реализует MyClass.

Похожие: Finding out if a type implements a generic interface

ответ

35

Чтобы ограничить его только специфический аромат общего интерфейса вы должны получить общее определение типа и сравнить с «открыть» интерфейс (IGeneric<> - обратите внимание, нет «T», указанного):

List<Type> genTypes = new List<Type>(); 
foreach(Type intType in t.GetInterfaces()) { 
    if(intType.IsGenericType && intType.GetGenericTypeDefinition() 
     == typeof(IGeneric<>)) { 
     genTypes.Add(intType.GetGenericArguments()[0]); 
    } 
} 
// now look at genTypes 

или как LINQ запрос-синтаксис:

Type[] typeArgs = (
    from iType in typeof(MyClass).GetInterfaces() 
    where iType.IsGenericType 
     && iType.GetGenericTypeDefinition() == typeof(IGeneric<>) 
    select iType.GetGenericArguments()[0]).ToArray(); 
13
typeof(MyClass) 
    .GetInterfaces() 
    .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGeneric<>)) 
    .SelectMany(i => i.GetGenericArguments()) 
    .ToArray(); 
+0

Хорошо, но это связано с EvilType IDontWantThis . Я не хочу EvilType. –

+0

Исправлено, просто нужно было простое условие Where(). –

2
Type t = typeof(MyClass); 
      List<Type> Gtypes = new List<Type>(); 
      foreach (Type it in t.GetInterfaces()) 
      { 
       if (it.IsGenericType && it.GetGenericTypeDefinition() == typeof(IGeneric<>)) 
        Gtypes.AddRange(it.GetGenericArguments()); 
      } 


public class MyClass : IGeneric<Employee>, IGeneric<Company>, IDontWantThis<EvilType> { } 

    public interface IGeneric<T>{} 

    public interface IDontWantThis<T>{} 

    public class Employee{ } 

    public class Company{ } 

    public class EvilType{ } 
Смежные вопросы