Frage:
Kann .NET Reflection verwendet werden, um zu bestimmen, ob ein Klassenattribut einen Nullable-Referenztyp verwendet?
Antwort:
Vor .NET 6 war für die Überprüfung eines nullbaren Referenztyps eine manuelle Überprüfung der Eigenschaft erforderlich:
<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) { // 值类型如果具有底层类型,则为可空类型 if (memberType.IsValueType) return Nullable.GetUnderlyingType(memberType) != null; // 检查属性本身的[Nullable]属性 var nullable = customAttributes .FirstOrDefault(x => x.AttributeType.FullName == "System.Runtime.CompilerServices.NullableAttribute"); // 如果存在[Nullable]并且具有值为2的字节参数,则该属性为可空类型 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; } // 检查封闭类型的[NullableContext]属性 for (var type = declaringType; type != null; type = type.DeclaringType) { var context = type.CustomAttributes .FirstOrDefault(_ => _.AttributeType.FullName == "System.Runtime.CompilerServices.NullableContextAttribute"); // 如果存在[NullableContext]并且具有值为2的字节参数,则封闭类型需要可空性 if (context != null && context.ConstructorArguments.Count == 1) { return (byte)context.ConstructorArguments[0].Value! == 2; } } // 如果找不到适用的属性,则假定该属性不可空 return false; }</code>
Ab .NET 6 vereinfacht die API NullabilityInfoContext jedoch die Handhabung von Nullable-Referenztypen:
<code class="language-csharp">public static bool IsNullable(PropertyInfo property) => property.GetCustomAttribute<NullabilityInfoContextAttribute>() ?.DeclaredReferenceType == ReferenceType.Nullable; public static bool IsNullable(FieldInfo field) => field.GetCustomAttribute<NullabilityInfoContextAttribute>() ?.DeclaredReferenceType == ReferenceType.Nullable; public static bool IsNullable(ParameterInfo parameter) => parameter.GetCustomAttribute<NullabilityInfoContextAttribute>() ?.DeclaredReferenceType == ReferenceType.Nullable;</code>
Das obige ist der detaillierte Inhalt vonKann .NET Reflection feststellen, ob eine Klasseneigenschaft einen Nullable-Referenztyp verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!