C # 8.0 wprowadza typy odwołania zerowalne. Oto prosta klasa z właściwością zerowalną:
public class Foo
{
public String? Bar { get; set; }
}
Czy istnieje sposób na sprawdzenie, czy właściwość klasy używa typu odwołania zerowego poprzez odbicie?
c#
reflection
nullable
nullable-reference-types
shadeglare
źródło
źródło
[NullableContext(2), Nullable((byte) 0)]
to do type (Foo
) - więc to jest to, co należy sprawdzić, ale musiałbym wykopać więcej, aby zrozumieć zasady interpretowania tego!string? X
dostaje żadnych atrybutów, istring Y
dostaje[Nullable((byte)2)]
się[NullableContext(2)]
na dostępowychNullableContext
. Jeśli jest mieszanka, to równieżNullable
używana.NullableContext
to optymalizacja, której celem jest unikanie emisji wNullable
dowolnym miejscu.Odpowiedzi:
Wygląda na to, że działa, przynajmniej na typach, z którymi go testowałem.
Musisz podać
PropertyInfo
właściwość, która Cię interesuje, a także właściwość, dlaType
której ta właściwość jest zdefiniowana ( nie typ pochodny ani nadrzędny - musi to być typ dokładny):Szczegółowe informacje można znaleźć w tym dokumencie .
Ogólną zasadą jest to, że albo sama właściwość może mieć
[Nullable]
atrybut, albo jeśli nie, typ otaczający może mieć[NullableContext]
atrybut. Najpierw szukamy[Nullable]
, a następnie, jeśli go nie znajdziemy, szukamy[NullableContext]
na podstawie typu zamykającego.Kompilator może osadzić atrybuty w zestawie, a ponieważ możemy patrzeć na typ z innego zestawu, musimy wykonać ładowanie tylko do odbicia.
[Nullable]
może być utworzony za pomocą tablicy, jeśli właściwość jest ogólna. W tym przypadku pierwszy element reprezentuje rzeczywistą właściwość (a kolejne elementy reprezentują ogólne argumenty).[NullableContext]
jest zawsze tworzony z pojedynczym bajtem.Wartość
2
oznacza „nullable”.1
oznacza „nie dopuszczać do wartości zerowej” i0
oznacza „nieświadomy”.źródło
IBusinessRelation : ICommon {}
/public interface ICommon { string? Name {get;set;} }
. Jeśli wywołam metodęIBusinessRelation
z właściwościąName
, otrzymam wartość false.ICommon
nieIBusinessRelation
. Każdy interfejs definiuje własnyNullableContext
. Wyjaśniłem swoją odpowiedź i dodałem do tego kontrolę czasu wykonywania.