ホームページ > バックエンド開発 > C++ > .NET リフレクションを使用して Null 許容参照型を決定するにはどうすればよいですか?

.NET リフレクションを使用して Null 許容参照型を決定するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-18 10:16:12
オリジナル
939 人が閲覧しました

How to Determine Nullable Reference Types Using .NET Reflection?

.NET リフレクションを使用して null 許容参照型をチェックする

.NET 6 では、特にこのタスクを処理するために NullabilityInfoContext API が導入されました。

.NET 6 以前のソリューション

NullabilityInfoContext API を使用する前は、プロパティを手動で検査して 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)
{
    // 检查属性本身的 [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] プロパティが含まれる場合があります。最初の要素は実際のプロパティを表し、後続の要素はジェネリック パラメーターを表します。
  • Nullability コンテキスト: Nullability コンテキスト値 2 は「Null 可能」を意味し、1 は「Null 不可」を意味し、0 は「無視」を意味します。

以上が.NET リフレクションを使用して Null 許容参照型を決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート