Если вы не хотите анализировать строки, но хотите убедиться, что вы получаете null
, decimal
или обнуляемый decimal
, то вы можете сделать что-то вроде этого:
public static Nullable<T> Convert<T>(object input)
where T : struct
{
if (input == null)
return null;
if (input is Nullable<T> || input is T)
return (Nullable<T>)input;
throw new InvalidCastException();
}
Вы могли бы сделать так, чтобы он возвращал значение NULL в последней строке, если вы хотите избежать исключений, хотя это не будет отличать реальные значения NULL от неправильных приведений.
Обратите внимание, что вы должны использовать оператор "is", так как оператор "as" не работает с типами значений, а приведение без проверки может вызвать исключение InvalidCastException.
Вы также можете сделать это методом расширения:
public static class ObjectExtensions
{
public static Nullable<T> ToNullable<T>(this object input)
where T : struct
{
if (input == null)
return null;
if (input is Nullable<T> || input is T)
return (Nullable<T>)input;
throw new InvalidCastException();
}
}
И используйте это так:
object value = 123.45m;
decimal? dec = value.ToNullable<decimal>();
Это поможет избежать предупреждений контракта кода о распаковке нулевых ссылок.