Таким образом теперь, когда у нас есть универсальная Ковариантность и Контравариантность в интерфейсах и делегатах в C#, мне было просто любопытно, если дали a Type
, можно выяснить ковариантность/контравариантность его универсальных аргументов. Я начал пытаться записать свою собственную реализацию, которая будет просматривать все методы на данном типе и видеть, вводит ли возврат и или аргументы соответствуют типам в универсальных аргументах. Проблема - это, даже если у меня есть это:
public interface IFoo<T>
{
void DoSomething(T item);
}
с помощью моей логики Похоже, что это должен быть контравариант, но так как мы на самом деле не указывали:
public interface IFoo<in T>
{
void DoSomething(T item);
}
(в параметре), это не на самом деле контравариант. Который приводит к моему вопросу: существует ли способ определить различие универсальных параметров?
Я не знаю, зачем вам это, НО вы можете смотреть на это с отражением извне шрифта. Вот информация о просмотре общих параметров для типа с использованием отражения:
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
Действительно интересно ... спасибо, что спросил об этом и заставил меня поискать.