2009-07-17 17 views
24

Genel bir arabirim var, yani IGeneric. Belirli bir tür için, IGeneric üzerinden bir sınıf imleçleri olan genel argümanları bulmak istiyorum.Sınıfın uyguladığı jenerik arabirimlerin tür bağımsız değişkenlerini alma

Bu örnekte daha açıktır:

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 (Tip t) uygulanması nedir?

Not: GetTypeArgsOfInterfacesOf yönteminin IGeneric için özel olarak yazıldığı varsayılabilir.

Düzenleme: Özellikle, MyClass'ın uyguladığı tüm arabirimlerden IGeneric arabirimini filtrelemeyi bildiğimi lütfen unutmayın.

İlgili: Finding out if a type implements a generic interface

cevap

35

Eğer arayüzü (IGeneric<> genel tür tanımı almak ve "open" karşılaştırmak gerekir jenerik arayüzünün sadece belirli lezzet bunu sınırlamak için - Belirtilen hayır "T" notu):

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 

ya LINQ sorgu-sözdizimi:

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

Tamam, ancak bu, IDontWantThis 'un EvilType'ı içerir. Ben EvilType istemiyorum. –

+0

Sabit, sadece(). –

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{ } 
İlgili konular