Gunakan refleksi .NET untuk menyemak jenis rujukan boleh batal
.NET 6 memperkenalkan NullabilityInfoContext
API khusus untuk mengendalikan tugas ini.
Penyelesaian Pra-.NET 6
Sebelum API NullabilityInfoContext
, anda boleh memeriksa sifat secara manual untuk menentukan kebolehtelapan:
<code class="language-csharp">public static bool IsNullable(PropertyInfo property) => IsNullableHelper(property.PropertyType, property.DeclaringType, property.CustomAttributes); public static bool IsNullable(FieldInfo field) => IsNullableHelper(field.FieldType, field.DeclaringType, field.CustomAttributes); public static bool IsNullable(ParameterInfo parameter) => IsNullableHelper(parameter.ParameterType, parameter.Member, parameter.CustomAttributes); private static bool IsNullableHelper(Type memberType, MemberInfo? declaringType, IEnumerable<CustomAttributeData> customAttributes) { // 检查属性本身的 [Nullable] 属性。 var nullable = customAttributes.FirstOrDefault(x => x.AttributeType.FullName == "System.Runtime.CompilerServices.NullableAttribute"); if (nullable != null && nullable.ConstructorArguments.Count == 1) { // 检查第一个参数的值(表示可空性上下文的字节)。 var args = (ReadOnlyCollection<CustomAttributeTypedArgument>)nullable.ConstructorArguments[0].Value!; if (args.Count > 0 && args[0].ArgumentType == typeof(byte)) { return (byte)args[0].Value! == 2; // 2 代表“可空”。 } } // 检查封闭类型的 [NullableContext] 属性。 for (var type = declaringType; type != null; type = type.DeclaringType) { var context = type.CustomAttributes.FirstOrDefault(x => x.AttributeType.FullName == "System.Runtime.CompilerServices.NullableContextAttribute"); if (context != null && context.ConstructorArguments.Count == 1 && context.ConstructorArguments[0].ArgumentType == typeof(byte)) { // 检查第一个参数的值(表示可空性上下文的字节)。 return (byte)context.ConstructorArguments[0].Value! == 2; } } // 未找到合适的属性,因此返回 false。 return false; }</code>
Kaedah ini meneliti atribut [Nullable]
dan [NullableContext]
dan mempertimbangkan pelbagai bentuk dan maknanya. Walau bagaimanapun, ia tidak mengendalikan kes di mana sifat dibenamkan dalam perhimpunan, yang memerlukan pemuatan jenis khusus pantulan daripada perhimpunan yang berbeza.
Nota lain
[Nullable]
yang diwujudkan dengan tatasusunan, dengan elemen pertama mewakili sifat sebenar dan elemen seterusnya mewakili parameter generik. Atas ialah kandungan terperinci Bagaimana untuk Menentukan Jenis Rujukan Nullable Menggunakan Refleksi .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!