C # 8.0 introduit des types de référence nullables. Voici une classe simple avec une propriété nullable:
public class Foo
{
public String? Bar { get; set; }
}
Existe-t-il un moyen de vérifier qu'une propriété de classe utilise un type de référence nullable via la réflexion?
[NullableContext(2), Nullable((byte) 0)]
au type (Foo
) - c'est donc ce qu'il faut vérifier, mais j'aurais besoin de creuser davantage pour comprendre les règles d'interprétation!string? X
n'obtient donc aucun attribut, etstring Y
obtient[Nullable((byte)2)]
avec[NullableContext(2)]
les accesseursNullableContext
. S'il y a un mélange, il est égalementNullable
utilisé.NullableContext
est une optimisation pour essayer d'éviter d'avoir à émettreNullable
partout.Réponses:
Cela semble fonctionner, au moins sur les types avec lesquels je l'ai testé.
Vous devez transmettre le
PropertyInfo
pour la propriété qui vous intéresse, ainsiType
que celui sur lequel cette propriété est définie ( pas un type dérivé ou parent - ce doit être le type exact):Consultez ce document pour plus de détails.
L'essentiel est que la propriété elle-même peut avoir un
[Nullable]
attribut, ou si ce n'est pas le cas, le type peut avoir un[NullableContext]
attribut. Nous cherchons d'abord[Nullable]
, puis si nous ne le trouvons pas, nous recherchons[NullableContext]
le type englobant.Le compilateur peut incorporer les attributs dans l'assembly, et comme nous pouvons examiner un type d'un assembly différent, nous devons effectuer une charge de réflexion uniquement.
[Nullable]
peut être instancié avec un tableau, si la propriété est générique. Dans ce cas, le premier élément représente la propriété réelle (et les autres éléments représentent des arguments génériques).[NullableContext]
est toujours instancié avec un seul octet.Une valeur de
2
signifie "nullable".1
signifie "non annulable" et0
signifie "inconscient".la source
IBusinessRelation : ICommon {}
/public interface ICommon { string? Name {get;set;} }
. Si j'appelle la méthodeIBusinessRelation
avec la propriété,Name
je reçois faux.ICommon
, nonIBusinessRelation
. Chaque interface définit la sienneNullableContext
. J'ai clarifié ma réponse et ajouté une vérification d'exécution pour cela.