【问题标题】:Nullable, check for default可空,检查默认值
【发布时间】:2013-07-01 11:48:54
【问题描述】:

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

方法的目的是重新创建 default() 在运行时所做的事情。

它适用于除 Nullable 类型之外的所有类型。甚至 ?-Types 也能正常工作。

我不知道如何找出分配给对象变量的值是否为 Nullable 而不是“常规值类型”

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

我们知道 default(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;
    }
}

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

【问题讨论】:

    标签: c# nullable


    【解决方案1】:

    似乎您可以通过执行以下操作来确定一个类型是否可以为空:

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

    不过,您的方法必须是通用的才能正常工作。

    【讨论】:

    • 再一次,没有泛型。也不确定是否拖钓
    • 啊,错过了。而且呵呵不,stackoverflow自己找到了我的头像,我也懒得改了。
    【解决方案2】:

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

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

    【讨论】:

    • 实际上我的代码不起作用,因为参数将它装箱到一个对象中。不是你说的原因。
    【解决方案3】:

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

    【讨论】:

    • @CSharpie 我建议根据哪个答案更好来选择 - 在这种情况下,我同意它是 driis's - 而不是基于小的时间差。
    【解决方案4】:

    您不能这样做,因为当您调用该方法时,可空结构被装箱为object,并变为nullInt32 值。这在较早的答案中进行了解释:Why GetType returns System.Int32 instead of Nullable<Int32>?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      相关资源
      最近更新 更多