9

如果我有一个值类型的泛型类型参数并且我想知道一个值是否等于默认值,我会像这样测试它:

static bool IsDefault<T>(T value){
    where T: struct
    return value.Equals(default(T));
}

如果我没有泛型类型参数,那么似乎我将不得不使用反射。如果该方法必须适用于所有值类型,那么有没有比我在这里做的更好的方法来执行这个测试?:

static bool IsDefault(object value){
   if(!(value is ValueType)){
      throw new ArgumentException("Precondition failed: Must be a ValueType", "value");
   }
   var @default = Activator.CreateInstance(value.GetType());
   return value.Equals(@default);  
}

附带说明一下,关于评估 Nullable 结构,我在这里没有考虑什么?

4

4 回答 4

8

我发现以下扩展方法很有用,适用于所有类型:

public static object GetDefault(this Type t)
{
    return t.IsValueType ? Activator.CreateInstance(t) : null;
}

public static T GetDefault<T>()
{
    var t = typeof(T);
    return (T) GetDefault(t);
}

public static bool IsDefault<T>(T other)
{
    T defaultValue = GetDefault<T>();
    if (other == null) return defaultValue == null;
    return other.Equals(defaultValue);
}
于 2011-08-15T17:56:33.740 回答
4

老问题,但接受的答案对我不起作用,所以我提交了这个(可能可以做得更好):

public static object GetDefault(this Type type)
{   
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        var valueProperty = type.GetProperty("Value");
        type = valueProperty.PropertyType;
    }

    return type.IsValueType ? Activator.CreateInstance(type) : null;
}

结果如下:

typeof(int).GetDefault();       // returns 0
typeof(int?).GetDefault();      // returns 0
typeof(DateTime).GetDefault();  // returns 01/01/0001 00:00:00
typeof(DateTime?).GetDefault(); // returns 01/01/0001 00:00:00
typeof(string).GetDefault();    // returns null
typeof(Exception).GetDefault(); // returns null
于 2013-07-16T14:04:58.387 回答
2

我需要ValueType作为参数来简化:

static bool IsDefault(ValueType value){
   var @default = Activator.CreateInstance(value.GetType());
   return value.Equals(@default);  
}
于 2011-08-15T17:11:36.237 回答
0

附带说明一下,关于评估 Nullable 结构,我在这里没有考虑什么?

是的,你错过了一些东西。通过将 anobject作为参数,您需要将代码调用到框Nullable<T>类型(将它们转换为 null 或它们的T值)。因此,如果您传递一个可空值,您is/throw将抛出,因为null永远不会是值类型。

编辑:正如@cdhowie 所说,您需要检查是否为空。这也适用于 Nullable 类型。

于 2011-08-15T17:27:53.700 回答