Rumah >pembangunan bahagian belakang >C++ >Bolehkah Refleksi .NET Menentukan sama ada Harta Kelas Menggunakan Jenis Rujukan Boleh Null?

Bolehkah Refleksi .NET Menentukan sama ada Harta Kelas Menggunakan Jenis Rujukan Boleh Null?

DDD
DDDasal
2025-01-18 10:21:10393semak imbas

Bolehkah refleksi .NET menentukan sama ada atribut kelas menggunakan jenis rujukan boleh batal?

Soalan:

Bolehkah refleksi .NET digunakan untuk menentukan sama ada atribut kelas menggunakan jenis rujukan boleh batal?

Jawapan:

Sebelum .NET 6, menyemak jenis rujukan boleh batal diperlukan menyemak sifat secara manual:

<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>

Walau bagaimanapun, bermula dengan .NET 6, API NullabilityInfoContext memudahkan pengendalian jenis rujukan nullable:

<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>

Can .NET Reflection Determine if a Class Property Uses a Nullable Reference Type?

Atas ialah kandungan terperinci Bolehkah Refleksi .NET Menentukan sama ada Harta Kelas Menggunakan Jenis Rujukan Boleh Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn