Определить обнуляемый тип - PullRequest
3 голосов
/ 31 августа 2011

Можно ли обнаружить тип Nullable (приведенный к объекту), когда он нулевой?

Поскольку Nullable<T> действительно структура, я думаю, что это возможно.

double? d = null;
var s = GetValue(d); //I want this to return "0" rather than ""

public string GetValue(object o)
{
    if(o is double? && !((double?)o).HasValue) //Not working with null
       return "0";
    if(o == null)
       return "";
    return o.ToString();
}  

Ответы [ 5 ]

5 голосов
/ 31 августа 2011

http://msdn.microsoft.com/en-us/library/ms228597(v=vs.80).aspx

Объекты, основанные на обнуляемых типах, помещаются в квадрат только в том случае, если объект не равен нулю.Если HasValue равно false, тогда вместо бокса ссылка на объект просто присваивается нулю.

и

Если объект не равен нулю - если HasValueистинно - тогда происходит бокс, но упаковывается только базовый тип, на котором основан обнуляемый объект.

Таким образом, у вас либо double, либо null.

public string GetValue(object o)
{
    if(o == null) // will catch double? set to null
       return "";

    if(o is double) // will catch double? with a value
       return "0";

    return o.ToString();
} 
5 голосов
/ 31 августа 2011

У вас есть метод GetValueOrDefault для каждого типа Nullable, не так ли?

3 голосов
/ 31 августа 2011

Ваш метод в настоящее время принимает object, что означает, что обнуляемое значение будет помещено в коробку ... и больше не будет обнуляемым значением. Значение o будет , либо будет значением в штучной упаковке типа, не допускающего значения NULL, либо пустой ссылкой.

Если возможно, измените ваш метод на общий:

public string GetValue<T>(T value)
{
    // Within here, value will still be a Nullable<X> for whatever type X
    // is appropriate. You can check this with Nullable.GetUnderlyingType
}
0 голосов
/ 07 ноября 2011

Насколько я понимаю, если вы пытаетесь определить, является ли ЛЮБОЙ объект обнуляемым, это можно написать довольно легко.

попробуйте это ...

public static bool IsNullable(dynamic value)
{
    try
    {
        value = null;
    }
    catch(Exception)
    {
        return false;
    }
    return true;
}

Simple! * * 1006

0 голосов
/ 31 августа 2011

Если o равно null, то o is double? будет ложным.Независимо от значения вашего входного параметра double? d

...