17 Ocak 2015 Cumartesi

Reflection ile Arayüzleri Bulmak

Not : Konuyla ilgili Reflection ile Nesne Yaratmak başlıklı yazıya göz atabilirsiniz.

Giriş
Belli bir arayüzden türeyen sınıfları aramak genel bir problem. Aşağıda konuyla ilgili notlarım var.

C#
AppDomain sınıfı
Bu sınıf assembly'leri yüklemek ve boşaltmak için kullanılabiliyor. Şimdiye kadar benim için tek kullanım yeri
AppDomain.CurrentDomain.GetAssemblies() şeklinde kullanmak oldu.

Type sınıfı
Bu sınıf bir nesne hakkında bilgi almak için kullanılır.

GetInterfaces metodu
Bu metodu her zaman Any() ile kullanmak mantıklı.

Örnekte assembly içinde tüm interface olmayan tipler bulunuyor. Daha sonra bu tiplerin GetInterfaces() metodu ile gerçekleştirdikleri arayüzler bulunuyor. Bu arayüzlerden generic olanlar seçiliyor. Generic olanlardan da bizim istediğimiz tipi gerçekleştirenler bulunuyor.

var type = typeof (IDataTypeConverter<>);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(x => x.GetTypes())
    .Where(x => !x.IsInterface) //ignore interface definitions
    .Where(x => x.GetInterfaces() //for each interface implemented
        .Where(i => i.IsGenericType) //if they're a generic interface
        .Any(i => i.GetGenericTypeDefinition() == type)); //check
Örnekte interface olan tüm tipler bulunuyor. Daha sonra ITranslatable'dan kalıtıp kalıtmadığına bakılıyor.
if(entity.GetType().GetInterfaces().Any(x =>
  x.IsGenericType &&
  x.GetGenericTypeDefinition() == typeof(ITranslatable<>)))



Hiç yorum yok:

Yorum Gönder