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
Linda Hamiltonoriginal
2025-01-18 10:16:12940parcourir

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

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

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