Есть ли способ определить дисперсию интерфейса / делегата в C # 4.0?

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

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

используя мою логику, это ВЫГЛЯДИТ так, как будто это должно быть контравариантным, но поскольку мы на самом деле не указали:

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

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


person BFree    schedule 27.05.2010    source источник
comment
зачем тебе это нужно?   -  person Mitch Wheat    schedule 27.05.2010
comment
@ Митч, я дам тебе знать, когда выясню это :) Я просто спросил из любопытства ...   -  person BFree    schedule 27.05.2010
comment
@MitchWheat Я использовал это сегодня, чтобы дважды проверить, что интерфейс в библиотеке, которую я вставлял в скрипт linqpad, действительно ковариантен, потому что что-то еще, что я пытался скомпилировать. Так вот что.   -  person piers7    schedule 03.10.2018
comment
звучит сложно ... слишком сложно для моего маленького мозга ....   -  person Mitch Wheat    schedule 03.10.2018


Ответы (1)


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

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

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

person Anderson Imes    schedule 27.05.2010
comment
Именно то, что я искал. Еще одна интересная вещь: если вы посмотрите на вторую ссылку, там написано, что она поддерживается начиная с .Net 2.0. Я предполагаю, что это было всегда, поскольку другие языки уже некоторое время поддерживают ковариацию / контравариантность (я думаю ...). Никогда не замечал этого .... - person BFree; 27.05.2010
comment
@BFree: интересное наблюдение. Я оставлю это на потом, чтобы разобраться. - person Anderson Imes; 27.05.2010