c# - 检查给定对象(引用或值类型)是否等于其默认值

标签 c# default-value generics

我正在尝试找到一种方法来检查给定对象的值是否等于其默认值。我环顾四周,想出了这个:

    public static bool IsNullOrDefault<T>(T argument)
    {
        if (argument is ValueType || argument != null)
        {
            return object.Equals(argument, default(T));
        }
        return true;
    }

我遇到的问题是我想这样调用它:

            object o = 0;
            bool b = Utility.Utility.IsNullOrDefault(o);

是的 o 是一个对象,但我想让它找出基本类型并检查它的默认值。在这种情况下,基本类型是一个整数,我想知道在这种情况下该值是否等于 default(int),而不是 default(object)。

我开始认为这可能是不可能的。

最佳答案

在您的示例中,您的整数是装箱的,因此您的 T 将是 object,object 的默认值为 null,因此这对您没有值(value)。如果对象是值类型,您可以获得它的一个实例(这将是默认实例)用作比较。像这样的东西:

if (argument is ValueType)
{
   object obj = Activator.CreateInstance(argument.GetType());
   return obj.Equals(argument);
}

在求助于此之前,您需要处理其他可能性。 Marc Gravell's answer提出了一些值得考虑的好点,但是对于您的方法的完整版本,您可能有

public static bool IsNullOrDefault<T>(T argument)
{
    // deal with normal scenarios
    if (argument == null) return true;
    if (object.Equals(argument, default(T))) return true;

    // deal with non-null nullables
    Type methodType = typeof(T);
    if (Nullable.GetUnderlyingType(methodType) != null) return false;

    // deal with boxed value types
    Type argumentType = argument.GetType();
    if (argumentType.IsValueType && argumentType != methodType) 
    {
        object obj = Activator.CreateInstance(argument.GetType());
        return obj.Equals(argument);
    }

    return false;
}

关于c# - 检查给定对象(引用或值类型)是否等于其默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553183/

相关文章:

javascript - 未指定数据类型时如何设置Ember模型默认值?

wpf - 如何更改继承的依赖属性的默认值?

java - 通用容器的通用工厂

c# - StringDictionary 类和 Dictionary<String,String> 之间有区别吗

c# - 三个平面的交点 3D - C#

c# - 如何找到创建对象的程序集?

c# - 使用 NotifyIcon 创建的 Windows 通知显示 "microsoft.explorer.notification"和 GUID

c# - 被调用实例方法中的锁定问题

JavaScript/JQuery : use $(this) in a variable-name

swift - "subclassing"通用结构