- обнаруживает ограничения, такие как class или new() (соответственно с помощью ReferenceTypeConstraint и DefaultConstructorConstraint)
Код: Выделить всё
typeof(Constrained).GetGenericArguments()[0].GenericParameterAttributes - обнаруживает ограничения базового типа (возвращает Type[], содержащий ограничения)
Код: Выделить всё
typeof(Constrained).GetGenericArguments()[0].GetGenericParameterConstraints() - Иногда это сочетание двух, например, структура NotNullableValueTypeConstraint | DefaultConstructorConstraint и базовый тип System.ValueType
Я пытался найти различия в сгенерированном IL, и (насколько я понимаю) есть только NullableAttribute (из System.Runtime.ComplierServices), применяемый либо к универсальному методу, либо к его объявляющему типу, либо к параметру типа, имеющему ограничение notnull, в зависимости от определения типа или метода.
Поскольку местоположение атрибута не всегда одинаковое, и я почти уверен, что существуют и другие способы его появления, я не думаю, что поиск этого атрибута является надежным решением.
Учитывая это два определения Foo (опять же, используя типы для простоты):
Код: Выделить всё
class Foo where T : notnull { }Код: Выделить всё
class Foo { }
Подробнее здесь: https://stackoverflow.com/questions/740 ... reflection
Мобильная версия