Maison > développement back-end > C++ > .NET Reflection peut-il déterminer si une propriété de classe utilise un type de référence Nullable ?

.NET Reflection peut-il déterminer si une propriété de classe utilise un type de référence Nullable ?

DDD
Libérer: 2025-01-18 10:21:10
original
453 Les gens l'ont consulté

La réflexion .NET peut-elle déterminer si un attribut de classe utilise un type de référence nullable ?

Question :

La réflexion .NET peut-elle être utilisée pour déterminer si un attribut de classe utilise un type de référence nullable ?

Réponse :

Avant .NET 6, la vérification d'un type de référence nullable nécessitait de vérifier manuellement la propriété :

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;
}
Copier après la connexion

Cependant, à partir de .NET 6, l'API NullabilityInfoContext simplifie la gestion des types de référence nullables :

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;
Copier après la connexion

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal