Есть ли способ определить дисперсию интерфейса / делегата в C # 4.0? - PullRequest
9 голосов
/ 27 мая 2010

Итак, теперь, когда у нас есть общие Covariance и Contravariance для интерфейсов и делегатов в C #, мне было просто любопытно, если дать Type, вы можете выяснить ковариацию / контрастность его общих аргументов. Я начал пытаться написать свою собственную реализацию, которая будет просматривать все методы данного типа и проверять, соответствуют ли возвращаемые типы и / или аргументы типам в общих аргументах. Проблема в том, что даже если у меня есть это:

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

используя мою логику, она выглядит, как будто она должна быть контравариантной, но поскольку мы на самом деле не указали:

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

(параметр in) на самом деле это не противоречиво. Что приводит к моему вопросу: есть ли способ определить дисперсию общих параметров?

1 Ответ

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

Я не знаю, почему вы хотели бы этого, НО вы можете посмотреть на это с отражением извне типа. Вот информация о просмотре общих параметров для типа с использованием отражения:

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

В частности, свойство Type.GenericParameterAttributes для типа, который вы возвращаете из вызова Type.GetGenericParameters, покажет свойства Co / Contravariance универсального аргумента ... это побитовое перечисление, которое покажет комбинацию этой информации:

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

Действительно интересно ... спасибо, что спросили об этом и заставили меня посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...