Utilisez la réflexion .NET pour vérifier les types de référence nullables
.NET 6 a introduit l'API NullabilityInfoContext
spécifiquement pour gérer cette tâche.
Solutions pré-.NET 6
Avant l'NullabilityInfoContext
API, vous pouviez inspecter manuellement les propriétés pour déterminer la nullité :
<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>
Cette méthode examine les attributs [Nullable]
et [NullableContext]
et considère leurs différentes formes et significations. Cependant, il ne gère pas le cas où les propriétés sont incorporées dans un assembly, ce qui nécessiterait un chargement spécifique à la réflexion de types provenant de différents assemblys.
Autres notes
[Nullable]
propriétés instanciées avec un tableau, où le premier élément représente la propriété réelle et les éléments suivants représentent les paramètres génériques. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!