如何检查给定对象是否可为空,换句话说,如何实现以下方法...

bool IsNullableValueType(object o)
{
    ...
}

编辑:我正在寻找可为空的值类型。我没有想到ref类型。
//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现在引用类型等于boolSystem.Boolean(true)类型的对象。我真正想要的是一个Nullable<bool>类型的对象

因此,现在作为一项解决方案,我决定检查o是否可为空,并围绕obj创建可为空的包装器。

最佳答案

有两种可为空的类型:Nullable<T>和reference-type。

乔恩(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
}

但是,如果您已将该值装箱到对象变量中,则此方法将无法很好地工作。

Microsoft文档:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/nullable-types/how-to-identify-a-nullable-type

10-07 18:45