Heim >Backend-Entwicklung >C++ >Wie ermittelt man Nullable-Referenztypen mithilfe von .NET Reflection?

Wie ermittelt man Nullable-Referenztypen mithilfe von .NET Reflection?

Linda Hamilton
Linda HamiltonOriginal
2025-01-18 10:16:12940Durchsuche

How to Determine Nullable Reference Types Using .NET Reflection?

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

  • Generische Typen: Generische Typen können [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.
  • Nullability-Kontext: Ein Nullability-Kontextwert von 2 bedeutet „nullbar“, 1 bedeutet „nicht nullbar“ und 0 bedeutet „ignorieren“.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn