C # 8.0 führt nullfähige Referenztypen ein. Hier ist eine einfache Klasse mit einer nullbaren Eigenschaft:
public class Foo
{
public String? Bar { get; set; }
}
Gibt es eine Möglichkeit zu überprüfen, ob eine Klasseneigenschaft über Reflektion einen nullbaren Referenztyp verwendet?
c#
reflection
nullable
nullable-reference-types
Schattenglanz
quelle
quelle
[NullableContext(2), Nullable((byte) 0)]
den Typ (Foo
) ergänzen - das ist also, worauf zu achten ist, aber ich müsste mehr graben, um die Regeln zu verstehen, wie man das interpretiert!string? X
bekommt keine Attribute, undstring Y
wird[Nullable((byte)2)]
mit[NullableContext(2)]
auf den Zugriffs-NullableContext
. Wenn es eine Mischung gibt, dann auchNullable
verwendet.NullableContext
ist eine Optimierung, um zu vermeiden, dassNullable
überall emittiert werden muss .Antworten:
Dies scheint zu funktionieren, zumindest bei den Typen, mit denen ich es getestet habe.
Sie müssen das
PropertyInfo
für die Eigenschaft übergeben, an der Sie interessiert sind, und auch das, fürType
das diese Eigenschaft definiert ist ( kein abgeleiteter oder übergeordneter Typ - es muss der genaue Typ sein):Weitere Informationen finden Sie in diesem Dokument .
Der allgemeine Kern ist, dass entweder die Eigenschaft selbst ein
[Nullable]
Attribut haben kann, oder wenn dies nicht der Fall ist, hat der einschließende Typ möglicherweise ein[NullableContext]
Attribut. Wir suchen zuerst nach[Nullable]
, und wenn wir es nicht finden, suchen wir nach[NullableContext]
dem umschließenden Typ.Der Compiler bettet die Attribute möglicherweise in die Assembly ein. Da wir möglicherweise einen Typ aus einer anderen Assembly betrachten, müssen wir nur Reflexionen laden.
[Nullable]
kann mit einem Array instanziiert werden, wenn die Eigenschaft generisch ist. In diesem Fall repräsentiert das erste Element die tatsächliche Eigenschaft (und weitere Elemente repräsentieren generische Argumente).[NullableContext]
wird immer mit einem einzelnen Byte instanziiert.Ein Wert von
2
bedeutet "nullable".1
bedeutet "nicht nullbar" und0
bedeutet "ahnungslos".quelle
IBusinessRelation : ICommon {}
/public interface ICommon { string? Name {get;set;} }
. Wenn ich die MethodeIBusinessRelation
mit der EigenschaftName
aufrufe, erhalte ich false.ICommon
nichtIBusinessRelation
. Jede Schnittstelle definiert ihre eigeneNullableContext
. Ich habe meine Antwort geklärt und eine Laufzeitprüfung hinzugefügt.