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