Soru Bir sınıfın uyguladığı jenerik arayüzlerin tip argümanlarını almak


Genel bir arayüzüm var, IGeneric. Belirli bir tür için, IGeneric üzerinden bir sınıf imleçleri olan genel argümanları bulmak istiyorum.

Bu örnekte daha nettir:

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 (Type t) uygulaması nedir?

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

Düzenle: Özellikle, MyClass'ın uyguladığı tüm arabirimlerden IGeneric arabiriminin nasıl filtreleneceğini merak ettiğimi lütfen unutmayın.

İlgili: Bir türün genel bir arayüz uygulayıp uygulamadığını öğrenmek


25
2017-07-17 08:51


Menşei




Cevaplar:


Bunu, genel bir arayüzün belirli bir lezzeti ile sınırlamak için genel tip tanımını almanız ve "açık" arayüzle karşılaştırmanız gerekir (IGeneric<> - "T" belirtilmemiş):

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 da LINQ sorgu-sözdizimi olarak:

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

38
2017-07-17 08:58





typeof(MyClass)
    .GetInterfaces()
    .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGeneric<>))
    .SelectMany(i => i.GetGenericArguments())
    .ToArray();

13
2017-07-17 08:55



Tamam ama bu IDontWantThis <EvilType> EvilType içerir. Ben EvilType istemiyorum. - Serhat Ozgel
Sabit, sadece (). - Sam Harwell


  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{ }

2
2017-07-17 09:20