C # 8.0 memperkenalkan jenis referensi yang dapat dibatalkan. Berikut adalah kelas sederhana dengan properti nullable:
public class Foo
{
public String? Bar { get; set; }
}
Apakah ada cara untuk memeriksa properti kelas menggunakan tipe referensi nullable melalui refleksi?
c#
reflection
nullable
nullable-reference-types
shadeglare
sumber
sumber
[NullableContext(2), Nullable((byte) 0)]
ke jenis (Foo
) - sehingga ini apa untuk memeriksa, tapi aku perlu menggali lebih memahami aturan bagaimana menafsirkan itu!string? X
tidak mendapat atribut, danstring Y
mendapat[Nullable((byte)2)]
dengan[NullableContext(2)]
di accesorNullableContext
. Jika ada campuran, makaNullable
gunakan juga.NullableContext
adalah pengoptimalan untuk mencoba dan menghindari keharusan memancarkanNullable
semua tempat.Jawaban:
Tampaknya ini berfungsi, setidaknya pada tipe yang saya uji.
Anda harus melewati
PropertyInfo
untuk properti yang Anda minati, dan jugaType
properti yang ditentukan ( bukan tipe turunan atau induk - harus tipe yang tepat):Lihat dokumen ini untuk detailnya.
Inti umum adalah bahwa properti itu sendiri dapat memiliki
[Nullable]
atribut di atasnya, atau jika tidak tipe terlampir mungkin memiliki[NullableContext]
atribut. Pertama-tama kita mencari[Nullable]
, maka jika kita tidak menemukannya kita mencari[NullableContext]
pada tipe penutup.Kompiler mungkin menanamkan atribut ke dalam rakitan, dan karena kita mungkin melihat jenis dari rakitan yang berbeda, kita perlu melakukan beban hanya refleksi.
[Nullable]
mungkin dipakai dengan array, jika properti itu generik. Dalam hal ini, elemen pertama mewakili properti aktual (dan elemen lebih lanjut mewakili argumen generik).[NullableContext]
selalu dipakai dengan satu byte.Nilai
2
sarana "nullable".1
berarti "tidak dapat dibatalkan", dan0
berarti "tidak menyadari".sumber
IBusinessRelation : ICommon {}
/public interface ICommon { string? Name {get;set;} }
. Jika saya memanggil metodeIBusinessRelation
dengan PropertiName
saya salah.ICommon
, tidakIBusinessRelation
. Setiap antarmuka mendefinisikan sendiriNullableContext
. Saya telah mengklarifikasi jawaban saya, dan menambahkan pemeriksaan runtime untuk ini.