首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#如何确定在对象中包装的值是空值还是默认值?

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

Stack Overflow用户
提问于 2016-07-07 10:38:26
回答 3查看 406关注 0票数 1

我目前正在编写一个自定义所需的验证属性,当值为null或默认值时,我希望恢复错误。默认情况下,我的意思是字符串为"“,int为0,双为0.0,对象为null。

为了实现这一点,我调用了以下功能,它适用于任何类型

代码语言:javascript
运行
复制
    protected bool IsNullOrDefault<T>(T value)
    {
        return object.Equals(value, default(T));
    }

以下是测试结果:

代码语言:javascript
运行
复制
    object obj = null;
    bool flag = IsNullOrDefault(obj));

旗帜=真

代码语言:javascript
运行
复制
    int i = 0;
    bool flag = IsNullOrDefault(i);

旗帜=真

代码语言:javascript
运行
复制
    double d = 0.0;
    Console.WriteLine(IsNullOrDefault(d));

旗帜=真

代码语言:javascript
运行
复制
    object value = 0;
    Console.WriteLine(IsNullOrDefault(value));

标志=假

在这里,在转的对象中包含int,但是它仍然认为它是一个对象,其默认值是null,当前值是。所以它返回False

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

代码语言:javascript
运行
复制
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    { ....
    }

根据该值,如何将对象转换为实际类型,在本例中是int?因此,即使在最后一个场景中,我也会收到True

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-08 10:31:47

最后,我可以通过使用dynamic类型转换值来实现这一点,

代码语言:javascript
运行
复制
    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在没有告诉它的情况下就适当地确定了它的类型。

票数 0
EN

Stack Overflow用户

发布于 2016-07-07 10:49:24

您必须认识到,defaulttypeof运算符返回的值是根据编译时确定的,一旦您的T被推断为object,您将始终得到与null相比较的值。

您的最佳选择是检查运行时类型:

代码语言:javascript
运行
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2016-07-07 10:45:13

对象值= 0;Console.WriteLine(IsNullOrDefault(值));

在本例中,TSystem.Object,因此default(T)null

您需要检查运行时类型,而不是编译时类型来处理这个问题:

代码语言:javascript
运行
复制
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;
  }
}

涵盖你可能遇到的所有类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38243350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档