Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menentukan Jenis Rujukan Nullable Menggunakan Refleksi .NET?

Bagaimana untuk Menentukan Jenis Rujukan Nullable Menggunakan Refleksi .NET?

Linda Hamilton
Lepaskan: 2025-01-18 10:16:12
asal
939 orang telah melayarinya

How to Determine Nullable Reference Types Using .NET Reflection?

Gunakan refleksi .NET untuk menyemak jenis rujukan boleh batal

.NET 6 memperkenalkan NullabilityInfoContext API khusus untuk mengendalikan tugas ini.

Penyelesaian Pra-.NET 6

Sebelum API NullabilityInfoContext, anda boleh memeriksa sifat secara manual untuk menentukan kebolehtelapan:

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

Kaedah ini meneliti atribut [Nullable] dan [NullableContext] dan mempertimbangkan pelbagai bentuk dan maknanya. Walau bagaimanapun, ia tidak mengendalikan kes di mana sifat dibenamkan dalam perhimpunan, yang memerlukan pemuatan jenis khusus pantulan daripada perhimpunan yang berbeza.

Nota lain

  • Jenis generik: Jenis generik mungkin mempunyai sifat [Nullable] yang diwujudkan dengan tatasusunan, dengan elemen pertama mewakili sifat sebenar dan elemen seterusnya mewakili parameter generik.
  • Konteks kebolehbatalan: Nilai konteks kebolehbatalan 2 bermaksud "boleh dibatalkan", 1 bermaksud "tidak boleh dibatalkan", dan 0 bermaksud "abaikan".

Atas ialah kandungan terperinci Bagaimana untuk Menentukan Jenis Rujukan Nullable Menggunakan Refleksi .NET?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan