C # 8.0 вводит обнуляемые ссылочные типы. Вот простой класс с обнуляемым свойством:
public class Foo
{
public String? Bar { get; set; }
}
Есть ли способ проверить свойство класса использует обнуляемый ссылочный тип через отражение?
c#
reflection
nullable
nullable-reference-types
shadeglare
источник
источник
[NullableContext(2), Nullable((byte) 0)]
к типу (Foo
) - вот что нужно проверять, но мне нужно больше копать, чтобы понять правила, как это интерпретировать!string? X
не получает атрибуты, иstring Y
получает[Nullable((byte)2)]
с[NullableContext(2)]
на аксессорахNullableContext
. Если есть смесь, тоNullable
используется также.NullableContext
это оптимизация, чтобы попытаться избежатьNullable
повсеместного излучения .Ответы:
Похоже, это работает, по крайней мере, для типов, с которыми я тестировал
Вам нужно передать
PropertyInfo
интересующее вас свойство, а также то, дляType
чего это свойство определено ( не производный или родительский тип - это должен быть точный тип):Смотрите этот документ для деталей.
Общая суть заключается в том, что либо у самого свойства может быть
[Nullable]
атрибут, либо, если оно отсутствует, у включающего типа может быть[NullableContext]
атрибут. Сначала мы ищем[Nullable]
, затем, если мы не найдем его, мы ищем[NullableContext]
в типе включения.Компилятор может встраивать атрибуты в сборку, и, поскольку мы можем рассматривать тип из другой сборки, нам нужно выполнить загрузку только для отражения.
[Nullable]
может быть создан с помощью массива, если свойство является общим. В этом случае первый элемент представляет фактическое свойство (а остальные элементы представляют общие аргументы).[NullableContext]
всегда создается одним байтом.Значение
2
означает «обнуляемый».1
означает «не обнуляемый» и0
означает «забывчивый».источник
IBusinessRelation : ICommon {}
/public interface ICommon { string? Name {get;set;} }
. Если я вызываю методIBusinessRelation
со свойством Property,Name
я получаю false.ICommon
, нетIBusinessRelation
. Каждый интерфейс определяет свой собственныйNullableContext
. Я уточнил свой ответ и добавил для этого проверку во время выполнения.