2010-05-27 8 views
8

Quindi ora che abbiamo Covariance e controvarianze generiche su interfacce e delegati in C#, ero solo curioso di sapere se è stato fornito un Type, è possibile capire la covarianza/controvarianza dei suoi argomenti generici. Ho iniziato a provare a scrivere la mia implementazione, che avrebbe esaminato tutti i metodi su un determinato tipo e verificato se i tipi di ritorno e gli argomenti corrispondono ai tipi negli argomenti generici. Il problema è che, anche se ho questo:C'è un modo per determinare la Varianza di un'interfaccia/delegato in C# 4.0?

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

usando la mia logica, sembra che dovrebbe essere contravariant, ma dato che non abbiamo in realtà specificare:

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

(il parametro) in realtà non è controverso. Il che porta alla mia domanda: esiste un modo per determinare la varianza dei parametri generici?

+0

perché ne avresti bisogno? –

+0

@ Mitch ti farò sapere quando lo capisco :) Stavo solo chiedendo per curiosità ... – BFree

risposta

5

Non so perché vorreste questo, MA potete guardarlo con il riflesso dall'esterno del tipo. Ecco le informazioni a guardare i parametri generici per un tipo utilizzando la riflessione:

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

In particolare, i Type.GenericParameterAttributes proprietà sul tipo si torna da una chiamata a Type.GetGenericParameters riveleranno le proprietà Co/controvarianza di l'argomento generico ... si tratta di un enum bit a bit che rivelerà la combinazione di queste informazioni:

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

Davvero interessante ... grazie per avermelo chiesto questo e facendomi guardare in su.

+1

Esattamente quello che stavo cercando. Un'altra cosa interessante è che, se si guarda a quel secondo link, si dice che è supportato da .Net 2.0. Immagino sia sempre stato lì da quando altre lingue hanno sostenuto Covariance/Contravariance per un po '(penso ...). Mai notato che ... – BFree

+0

@BFree: osservazione interessante. Dovrò lasciarlo per dopo per esaminare. –

Problemi correlati