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
Lepaskan: 2025-01-18 10:21:10
asal
391 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan