Question

Y at-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 types de retour? En d'autres termes, puis-je utiliser la réflexion pour la différence entre les deux interfaces:

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


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

L'IL pour les deux semble le même.

Était-ce utile?

La solution

Il y a un GenericParameterAttributes Enumeration que vous peuvent utiliser pour déterminer les indicateurs de la variance sur un type générique.

Pour obtenir le type générique, utilisez typeof mais omettez les paramètres de type. Laisser 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;";
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top