Verwenden Sie .NET Reflection, um nullfähige Referenztypen zu überprüfen
.NET 6 hat die NullabilityInfoContext
-API speziell für diese Aufgabe eingeführt.
Lösungen vor .NET 6
Vor der NullabilityInfoContext
API konnten Sie Eigenschaften manuell überprüfen, um die Nullbarkeit zu bestimmen:
<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>
Diese Methode untersucht die Attribute [Nullable]
und [NullableContext]
und berücksichtigt ihre verschiedenen Formen und Bedeutungen. Der Fall, dass Eigenschaften in eine Assembly eingebettet sind, wird jedoch nicht behandelt, was ein reflexionsspezifisches Laden von Typen aus verschiedenen Assemblys erfordern würde.
Andere Hinweise
[Nullable]
Eigenschaften haben, die mit einem Array instanziiert werden, wobei das erste Element die tatsächliche Eigenschaft darstellt und nachfolgende Elemente die generischen Parameter darstellen. Das obige ist der detaillierte Inhalt vonWie ermittelt man Nullable-Referenztypen mithilfe von .NET Reflection?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!