Как определить, является ли ненулевой объект Nullable структурой?

Есть ли способ узнать об этом?

Я нашел одно сообщение, в котором задан очень похожий вопрос на Как проверить, есть ли у объекта допускает значение NULL? Ответ объясняет, как определить, допускает ли объект значение NULL , если есть доступ к параметру универсального типа . Это достигается с помощью Nullabe.GetUnderlyingType (typeof (T)) . Однако, если у вас есть только объект, и он не равен нулю, можно ли определить, действительно ли это тип значения, допускающий значение NULL?

Другими словами, есть ли лучший способ, чем индивидуальная проверка каждого возможного типа значения, допускающего значение NULL, чтобы определить, является ли структура в штучной упаковке типом значения?

void Main(){
    Console.WriteLine(Code.IsNullableStruct(Code.BoxedNullable));
} 


public static class Code{
    private static readonly int? _nullableInteger = 43;

    public static bool IsNullableStruct(object obj){
                  if(obj == null) throw new ArgumentNullException("obj");
                  if(!obj.GetType().IsValueType) return false;
                  return IsNullablePrimitive(obj);
            }
    public static bool IsNullablePrimitive(object obj){
         return obj is byte? || obj is sbyte? || obj is short? || obj is ushort? || obj is int? || obj is uint? || obj is long? || obj is ulong? || obj is float? || obj is double? || obj is char? || obj is decimal? || obj is bool? || obj is DateTime? || obj is TimeSpan?;
    }

    public static object BoxedNullable{
        get{ return _nullableInteger; }
    }
}

-

Обновить

Я нашел эту статью в MSDN , и в ней говорится, что вы не можете определить, является ли тип структурой, допускающей значение NULL, с помощью вызова GetType () .

-

Обновление №2

Очевидно, предложенный мной метод тоже не работает, потому что int x = 4; Console.WriteLine (x - int?); - True. (См. Комментарий)

5
задан Community 23 May 2017 в 12:12
поделиться