首頁 > 後端開發 > C++ > 如何使用 .NET 反射來確定可空參考類型?

如何使用 .NET 反射來確定可空參考類型?

Linda Hamilton
發布: 2025-01-18 10:16:12
原創
940 人瀏覽過

How to Determine Nullable Reference Types Using .NET Reflection?

利用.NET反射檢查可空引用型別

.NET 6 引入了 NullabilityInfoContext API,專門用於處理此任務。

.NET 6之前的方案

NullabilityInfoContext API出現之前,您可以手動檢查屬性來確定可空性:

<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>
登入後複製

此方法可以檢查 [Nullable][NullableContext] 屬性,並考慮它們的各種形式和意義。但是,它不處理屬性嵌入到組件的情況,這需要對來自不同組件的類型進行反射專用載入。

其他注意事項

  • 泛型類型:泛型類型可能具有以陣列實例化的 [Nullable] 屬性,其中第一個元素表示實際屬性,後續元素表示泛型參數。
  • 可空性上下文:可空性上下文值為 2 表示“可空”,1 表示“不可空”,0 表示“忽略”。

以上是如何使用 .NET 反射來確定可空參考類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板