C# 如何确定对象中包装的值是 null 还是默认值?

Muk*_*ani 1 c# null object default-value validationattribute

我目前正在编写自定义所需的验证属性,并且我想在值为 null 或默认值时恢复错误。对于默认值,我的意思是“”代表字符串,0代表整数,0.0代表双精度,空代表对象。

为了实现这一目标,我调用以下函数,该函数适用于任何类型

    protected bool IsNullOrDefault<T>(T value)
    {
        return object.Equals(value, default(T));
    }
Run Code Online (Sandbox Code Playgroud)

以下是测试:

    object obj = null;
    bool flag = IsNullOrDefault(obj));
Run Code Online (Sandbox Code Playgroud)

标志=真

    int i = 0;
    bool flag = IsNullOrDefault(i);
Run Code Online (Sandbox Code Playgroud)

标志=真

    double d = 0.0;
    Console.WriteLine(IsNullOrDefault(d));
Run Code Online (Sandbox Code Playgroud)

标志=真

    object value = 0;
    Console.WriteLine(IsNullOrDefault(value));
Run Code Online (Sandbox Code Playgroud)

标志=假

这里对象内部又包含了int,但它仍然认为它是一个对象,其默认值为null,当前值为0。所以它返回False

问题是,我要重写的框架方法为我提供了对象值,因此它将始终与上面提到的最后一个场景相匹配。

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    { ....
    }
Run Code Online (Sandbox Code Playgroud)

根据值,我们如何将对象转换为实际类型(在本例中为int )?因此,即使对于上面的最后一个场景,我也会收到True 。

hai*_*770 5

default您必须意识到和运算符返回的值是在编译时typeof确定的,一旦您被推断为,您总是会得到与 相比的值。Tobjectnull

最好的办法是检查运行时类型:

protected bool IsNullOrDefault<T>(T value)
{
    if (value == null)
        return true;

    var actualType = value.GetType();

    if (actualType.IsValueType)
        return value.Equals(Activator.CreateInstance(actualType));

    return false;
}
Run Code Online (Sandbox Code Playgroud)