可以为空,检查默认值

时间:2013-07-03 16:56:19

标签: c# nullable

我试图在环境中创建一个扩展方法,其中使用了大量的反射。

方法的目的是重新创建default()在运行时的作用。

它适用于除Nullable<>之外的所有内容。类型。甚至?-Types正常工作。

如果分配给对象变量的值是Nullable<>,我不知道如何找到答案。而不是“常规的价值类型”

Nullable.GetUnderlyingType-Method在这种情况下返回null,但适用于?-Types。

我们知道默认(Nullable)== null。 当Nullable分配0时,我的扩展方法会产生错误的结果,因为0 == default(int)。

我希望你能得到我想在这里解释的内容,简而言之: - 如何确定“随机”对象是否为Nullable而不是int?

方法看起来像这样(为简单起见,删除了任何缓存) 我从这里获取了部分How to check if an object is nullable?

public static bool IsDefault(this object obj)
{
    if(obj == null)
        return true;
    else
    {
        Type objType = obj.GetType(); // This gives int32 for Nullabe<int> !?!

        if(Nullable.GetUnderlyingType(objType) != null)
            return false;
        else if(objType.IsValueType)
            return Object.Equals(obj, Activator.CreateInstance(objType);
        else
            return false;
    }
}

为了更清楚,我不能使用通用的东西......

4 个答案:

答案 0 :(得分:3)

你不能这样做,因为当你调用方法时,可以为空的结构被装箱为object,并成为nullInt32值。这在前面的答案中有解释:Why GetType returns System.Int32 instead of Nullable<Int32>?

如果您的变量在调用此方法的位置键入为对象,我认为您无法获得所需的信息 - 它已经装箱。

答案 1 :(得分:2)

当一个可空类型被装箱到object时,它可以为空的这一事实将丢失:它要么变成普通的int,要么变成普通的null。如果您的对象已存储为object类型,则无法恢复此状态。

答案 2 :(得分:0)

似乎你可以通过这样的事情找出一个类型是否可以为空:

public static bool IsDefault<T>( this T obj )
{
    var t = typeof( T );
    var isNullable = t.IsGenericType && t.GetGenericTypeDefinition() == typeof( Nullable<> );
    // ...
}

尽管如此,您的方法必须是通用的。

答案 3 :(得分:-1)

来自http://msdn.microsoft.com/en-us/library/ms366789.aspx

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}