Есть ли что-нибудь, чтобы узнать это?
Я нашел один пост, в котором задавался очень похожий вопрос на Как проверить, можно ли обнулять объект? Ответ объясняет, как определить, можно ли обнулять объект , если есть доступ к универсальному. Введите параметр . Это достигается с помощью Nullabe.GetUnderlyingType(typeof(T))
. Однако, если у вас есть только объект, и он не является нулевым, можете ли вы определить, является ли он на самом деле Nullable ValueType?
Другими словами, есть ли лучший способ, чем индивидуальная проверка каждого возможного типа значения, допускающего значение 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 , и там говорится, что вы не можете определить, является ли тип структурой Nullable, с помощью вызова GetType()
.
-
Обновление # 2
Очевидно, что предложенный мной метод тоже не работает, потому что int x = 4; Console.WriteLine(x is int?);
- True. (См. Комментарий)