我目前正在编写一个自定义所需的验证属性,当值为null或默认值时,我希望恢复错误。默认情况下,我的意思是字符串为"“,int为0,双为0.0,对象为null。
为了实现这一点,我调用了以下功能,它适用于任何类型
    protected bool IsNullOrDefault<T>(T value)
    {
        return object.Equals(value, default(T));
    }以下是测试结果:
    object obj = null;
    bool flag = IsNullOrDefault(obj));旗帜=真
    int i = 0;
    bool flag = IsNullOrDefault(i);旗帜=真
    double d = 0.0;
    Console.WriteLine(IsNullOrDefault(d));旗帜=真
    object value = 0;
    Console.WriteLine(IsNullOrDefault(value));标志=假
在这里,在转的对象中包含int,但是它仍然认为它是一个对象,其默认值是null,当前值是。所以它返回False。
问题是,我正在重写的框架方法将值作为对象提供给我,因此它将始终与上面提到的最后一个场景相匹配。
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    { ....
    }根据该值,如何将对象转换为实际类型,在本例中是int?因此,即使在最后一个场景中,我也会收到True。
发布于 2016-07-07 10:49:24
您必须认识到,default和typeof运算符返回的值是根据编译时确定的,一旦您的T被推断为object,您将始终得到与null相比较的值。
您的最佳选择是检查运行时类型:
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;
}https://stackoverflow.com/questions/38243350
复制相似问题