2010-05-27 14 views
8

Şu an C# 'da arayüzler ve delegeler üzerinde genel Covariance ve Contravariance var, şimdi bir Type verilirse merak ettim, onun genel argümanlarının kovaryans/kontravaryansını anlayabilirsiniz. Belirli bir türdeki tüm yöntemlere bakacak ve dönüş türlerinin ve argümanlarının genel argümanlardaki türlerle eşleşip eşleşmediğini görmek için kendi uygulamamı yazmaya çalıştım. o kontravaryant olması gerektiği gibiC# 4.0'da bir Arabirim/Temsilcinin Varyansını belirlemenin bir yolu var mı?

public interface IFoo<T> 
{ 
    void DoSomething(T item); 
} 

benim mantığı kullanarak, bu GÖRÜNÜYOR, ama olmadı çünkü aslında belirtmek: Sorun olsa bile bu böyledir

public interface IFoo<in T> 
{ 
    void DoSomething(T item); 
} 

(parametresinde) Aslında kontravaryant değil. Bu benim soruma yol açar: Jenerik parametrelerin varyansını belirlemenin bir yolu var mı?

+0

Neden buna ihtiyacınız var? –

+0

@ Mitch Bunu anladığımda size haber vereceğim :) Sadece meraktan dolayı soruyordum ... – BFree

cevap

5

Bunu neden isteyeceğinizi bilmiyorum, ANCAK yazının dışından gelen yansımayla bakabilirsiniz. İşte yansımayı kullanarak türü için Jenerik Parametreleri bakarak hakkında bilgi var: Özellikle

http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx

, sen Eş/contravariance özelliklerini ortaya çıkaracaktır Type.GetGenericParameters çağrısından geri almak tipine mülkiyet Type.GenericParameterAttributes Bu soran ve bana bakmak yapmak için

Gerçekten ilginç

http://msdn.microsoft.com/en-us/library/system.reflection.genericparameterattributes.aspx

... teşekkürler: jenerik argüman ... bu bilgilerinin birleşimini ortaya çıkaracaktır arasında ikilik enum var.

+1

Tam olarak aradığım şey. Bir başka ilginç şey, eğer ikinci bağlantıya bakarsanız, o zaman .Net 2.0'dan beri desteklendiğini söylüyor. Sanırım her zaman diğer diller Covariance/Contravariance'ı bir süredir desteklediğinden beri oradaydım (sanırım ...). Hiç farketmediniz .... – BFree

+0

@BFree: ilginç gözlem. Daha sonra bakmak için bunu bırakmak zorunda kalacağım. –

İlgili konular