Обнаружение отклонений от параметров универсального типа интерфейсов - PullRequest
4 голосов
/ 20 мая 2010

Есть ли способ отразить на интерфейсе обнаружение отклонений от его параметров общего типа и возвращаемых типов? Другими словами, могу ли я использовать отражение, чтобы различать два интерфейса:

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


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

IL для обоих выглядит одинаково.

1 Ответ

6 голосов
/ 20 мая 2010

Существует перечисление GenericParameterAttributes , которое можно использовать для определения флагов дисперсии для универсального типа.

Чтобы получить универсальный тип, используйте typeof, но не указывайте параметры типа. Оставьте в запятых, чтобы указать количество параметров (код по ссылке):

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

Затем вы можете проверить флаги параметров типа:

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;";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...