Maison > développement back-end > C++ > Comment déterminer les types de référence nullables à l'aide de .NET Reflection ?

Comment déterminer les types de référence nullables à l'aide de .NET Reflection ?

Linda Hamilton
Libérer: 2025-01-18 10:16:12
original
1002 Les gens l'ont consulté

How to Determine Nullable Reference Types Using .NET Reflection?

Utilisez la réflexion .NET pour vérifier les types de référence nullables

.NET 6 a introduit l'API NullabilityInfoContext spécifiquement pour gérer cette tâche.

Solutions pré-.NET 6

Avant l'NullabilityInfoContext API, vous pouviez inspecter manuellement les propriétés pour déterminer la nullité :

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

Cette méthode examine les attributs [Nullable] et [NullableContext] et considère leurs différentes formes et significations. Cependant, il ne gère pas le cas où les propriétés sont incorporées dans un assembly, ce qui nécessiterait un chargement spécifique à la réflexion de types provenant de différents assemblys.

Autres notes

  • Types génériques : Les types génériques peuvent avoir des [Nullable] propriétés instanciées avec un tableau, où le premier élément représente la propriété réelle et les éléments suivants représentent les paramètres génériques.
  • Contexte de nullité : Une valeur de contexte de nullabilité de 2 signifie "nullable", 1 signifie "non nullable" et 0 signifie "ignorer".

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal