1. ホーム
  2. c#

[解決済み】オブジェクトがnullableかどうかを確認する方法は?

2022-04-06 07:57:53

質問

与えられたオブジェクトがnullableであるかどうかを確認するにはどうしたらよいでしょうか。言い換えれば、次のメソッドを実装するにはどうしたらよいでしょうか。

bool IsNullableValueType(object o)
{
    ...
}

nullable を探しています。 の値の種類を指定します。 参照型を意識したわけではありません。

//Note: This is just a sample. The code has been simplified 
//to fit in a post.

public class BoolContainer
{
    bool? myBool = true;
}

var bc = new BoolContainer();

const BindingFlags bindingFlags = BindingFlags.Public
                        | BindingFlags.NonPublic
                        | BindingFlags.Instance
                        ;


object obj;
object o = (object)bc;

foreach (var fieldInfo in o.GetType().GetFields(bindingFlags))
{
    obj = (object)fieldInfo.GetValue(o);
}

obj 型のオブジェクトを参照するようになりました。 bool ( System.Boolean と同じ値を持つ) true . 私が本当に欲しかったのは、型 Nullable<bool>

そこで、回避策として、oがnullableかどうかをチェックし、objの周りにnullableラッパーを作成することにしました。

解決方法は?

nullable - には2つのタイプがあります。 Nullable<T> と参照型があります。

Jonから、ボックス型だと型が取りにくいけど、ジェネリックスだと取れるよと訂正がありました。 - ということで、以下はいかがでしょうか。これは実際に型をテストしているところです T を使用していますが obj パラメータは純粋に一般的な型推論を行うため(呼び出しやすくするため)です。 obj パラメータを使用します。

static bool IsNullable<T>(T obj)
{
    if (obj == null) return true; // obvious
    Type type = typeof(T);
    if (!type.IsValueType) return true; // ref-type
    if (Nullable.GetUnderlyingType(type) != null) return true; // Nullable<T>
    return false; // value-type
}

しかし、すでにオブジェクト変数に値をボックス化している場合、これはあまりうまくいきません。

マイクロソフトのドキュメントです。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/nullable-types/how-to-identify-a-nullable-type