> 백엔드 개발 > C++ > .NET 리플렉션에서는 클래스 속성이 Null 허용 참조 유형을 사용하는지 확인할 수 있습니까?

.NET 리플렉션에서는 클래스 속성이 Null 허용 참조 유형을 사용하는지 확인할 수 있습니까?

DDD
풀어 주다: 2025-01-18 10:21:10
원래의
434명이 탐색했습니다.

.NET 리플렉션을 통해 클래스 특성이 null 허용 참조 유형을 사용하는지 여부를 확인할 수 있나요?

질문:

.NET 리플렉션을 사용하여 클래스 특성이 null 허용 참조 유형을 사용하는지 여부를 확인할 수 있나요?

정답:

.NET 6 이전에는 null 허용 참조 유형을 확인하려면 속성을 수동으로 확인해야 했습니다.

<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>
로그인 후 복사

그러나 .NET 6부터 NullabilityInfoContext API는 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>
로그인 후 복사

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

위 내용은 .NET 리플렉션에서는 클래스 속성이 Null 허용 참조 유형을 사용하는지 확인할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿