Обнаружение отклонений от общих параметров типа интерфейсов
Есть ли способ отразить на интерфейсе, чтобы обнаружить отклонение от его параметров общего типа и возвращаемых типов? Другими словами, могу ли я использовать отражение, чтобы различать два интерфейса:
interface IVariant<out R, in A>
{
R DoSomething(A arg);
}
interface IInvariant<R, A>
{
R DoSomething(A arg);
}
IL для обоих выглядит одинаково.
1 ответ
Решение
Существует перечисление 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;";
}
}