2010-05-20 28 views
4

Existe-t-il un moyen de réfléchir sur une interface pour détecter la variance sur ses paramètres de type générique et les types de retour? En d'autres termes, puis-je utiliser la réflexion pour différencier les deux interfaces:Détecter la variance sur les paramètres de type générique des interfaces

interface IVariant<out R, in A> 
{ 
    R DoSomething(A arg); 
} 


interface IInvariant<R, A> 
{ 
    R DoSomething(A arg); 
} 

L'IL pour les deux est identique.

Répondre

6

Il existe un GenericParameterAttributes Enumeration que vous pouvez utiliser pour déterminer les indicateurs de variance sur un type générique.

Pour obtenir le type générique, utilisez typeof mais ignorez les paramètres de type. Laissez les virgules pour indiquer le nombre de paramètres (code à partir du lien):

Type theType = typeof(Test<,>); 
Type[] typeParams = theType.GetGenericArguments(); 

Vous pouvez ensuite examiner les drapeaux des paramètres de type:

GenericParameterAttributes gpa = typeParams[0].GenericParameterAttributes; 
GenericParameterAttributes variance = gpa & GenericParameterAttributes.VarianceMask; 

string varianceState; 
// Select the variance flags. 
if (variance == GenericParameterAttributes.None) 
{ 
    varianceState= "No variance flag;"; 
} 
else 
{ 
    if ((variance & GenericParameterAttributes.Covariant) != 0) 
    { 
     varianceState= "Covariant;"; 
    } 
    else 
    { 
     varianceState= "Contravariant;"; 
    } 
}