2013-08-14 17 views
20

Benkontrol türüdür genel tür argümanları dikkate almadan genel arabirimi uygulaması halinde

public interface MyInterface<TKey, TValue> 
{ 
} 

Uygulamalar alakasız bir arayüze sahip. Şimdi belirli bir türün bu arayüzün bir uygulaması olup olmadığını kontrol etmek istiyorum. Bu yöntem

için başarısız olur, ancak nasıl kontrol yapacağımı bilmiyorum.

public void CheckIfTypeImplementsInterface(Type type) 
{ 
    var result1 = typeof(MyInterface<,>).IsAssignableFrom(type); --> false 
    var result2 = typeof(MyInterface<int,string>).IsAssignableFrom(type); --> true 
} 

Sonuç1'in doğru olması için ne yapmam gerekiyor?

+0

Bir "MyInterface" arabirimi oluşturmayı düşündünüz ve "MyInterface : MyInterface'? –

cevap

33

Bildiğim kadarıyla, bunu yapmanın tek yolu tüm arabirimleri almak ve genel tanımın gerekli arabirim türüyle eşleşip eşleşmediğini görmek.

bool result1 = type.GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Select(i => i.GetGenericTypeDefinition()) 
    .Contains(typeof(MyInterface<,>)); 

DÜZENLEME: Jon açıklamalarda işaret ettiği gibi, aynı zamanda yapabileceği:

bool result1 = type.GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Any(i => i.GetGenericTypeDefinition() == typeof(MyInterface<,>)); 
+4

Son ikisini şu şekilde değiştirebilirsiniz: '.Any (i => i.GetGenericTypeDefinition() == typeof (MyInterface <,>)) –

2

Genellikle bu tür davranışı yalnızca durumlarda gerekli olan bir arabirim bağlı değildir bazı işlevleri içeren nerede jenerik tip parametreleri. Arayüzler üzerinde kontrole sahipseniz, en iyi çözüm, türe bağlı olmayan bölümden tip-bağımlı parçaların miras almasıdır. Mevcut toplama arayüzleri olmasaydı Örneğin, bir onlara şöyle tanımlayabilirsiniz:

interface ICountable 
    { CollectionAttribute Attributes {get;} int Count {get;} } 
interface ICollection<T> : IEnumerable<T> ICountable 
    { ... and other stuff ... } 

böyle bir şey ICollection ile gerçekleştirilmiş olsaydı, o zaman kod bir IEnumerable<Animal> bekliyordum ama tip CatList bir nesne var Bu, yalnızca IList<Cat> öğesinin bu nesnenin Count üyesini kullanarak hiçbir sorunu olmaz (List<Animal>, jenerik olmayan ICollection'u uygular, ancak diğer IList<Animal> uygulamaları olmayabilir). Eğer bir IEnumerable<Animal> bekliyorsanız zaman nasılsa ICollection<Cat> ait Count yöntemi bulmak koduna sahip göreviyle takılıp

Olduğu gibi, yüzden bir Dictionary<Type, Func<IEnumerable<Animal>, int> gibi bir şey inşa etmek faydalı olabilir Eğer ettik kez o CatList'un ICollection<Cat>.Count değerini bulduğunu, argümanını ICollection<Cat>'a çevirecek, Count numaralı telefonu arayacak ve sonucunu döndürecek bir yönteme delege oluşturabilirsiniz. Böyle bir sözlüğünüz varsa, başka bir CatList verilirse, söz konusu delege sözlüğünden basitçe çağırabilirsiniz.

+0

Tamamen katılıyorum, ancak benim durumumda yalnızca bir Öznitelikte temel bir kontrol yapmak istiyorum [CustomAttribute (typeof (ClassName))] 've ben className arabirimi uygulamak için gerektirir.Kodunda, hem genel özellikleri biliyorum ve ClassName yeni bir örneğini oluşturmak için yansıma kullanabilirsiniz –

İlgili konular