развернуть T от Nullable <T> - PullRequest
0 голосов
/ 12 мая 2011

Требуется простой, но эффективный метод для получения значения из Nullable, когда T не известно во время компиляции.

Пока что есть что-то вроде этого:

public static object UnwrapNullable(object o)
{
    if (o == null)
        return null;

    if (o.GetType().IsGenericType && o.GetType().GetGenericTypeDefinition() == typeof(Nullable<>))
        return ???

    return o;
}

здесь можно что-нибудь сделать, не вдаваясь в динамическую генерацию кода?

используется в .NET 2.0

Ответы [ 2 ]

7 голосов
/ 12 мая 2011

o может никогда относится к экземпляру Nullable<T>. Если вы укажете значение типа значения, допускающего значение NULL, вы в конечном итоге получите значение в рамке ненулевого значения базового типа или нулевую ссылку.

Другими словами, o.GetType() может никогда вернуть Nullable<T> для любое значение o - независимо от типа o. Например:

Nullable<int> x = 10;
Console.WriteLine(x.GetType()); // System.Int32

Здесь мы заканчиваем упаковкой значения x, потому что GetType() объявлено в object и не переопределяется в Nullable<T> (потому что оно не виртуально). Это немного странно.

0 голосов
/ 12 мая 2011

Это не имеет смысла.

Если у вас есть код:

int? x = null; //int? == Nullable<int>
if ( null == x ) { Console.WriteLine("x is null"); }
else { Console.WriteLine( "x is " + x.ToString() ); }

В результате будет напечатано "x is null" в консоли.

...