我目前正在编写一个自定义所需的验证属性,当值为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-08 10:31:47
最后,我可以通过使用dynamic类型转换值来实现这一点,
    protected bool IsNullOrDefault(object obj)
    {
        bool retval = false;
        if (obj == null)
        {
            retval = true;
        }
        else
        {
            retval = IsEmpty((dynamic)obj);
        }
        return retval;
    }
    protected bool IsEmpty<T>(T value)
    {
        return object.Equals(value, default(T));
    }在希望类型的解析发生在运行时而不是在编译时,您应该使用
dynamic类型。因此,在这种情况下,值self在没有告诉它的情况下就适当地确定了它的类型。
发布于 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;
}发布于 2016-07-07 10:45:13
对象值= 0;Console.WriteLine(IsNullOrDefault(值));
在本例中,T是System.Object,因此default(T)是null。
您需要检查运行时类型,而不是编译时类型来处理这个问题:
public bool IsNullOrDefault(object value) {
  if (value is Int32) {
    return (Int32)value == 0;
  } else if (value is Int64) {
    return (Int64)value == 0L;
  } else if …
  } else {
    return value == null;
  }
}涵盖你可能遇到的所有类型。
https://stackoverflow.com/questions/38243350
复制相似问题