Краткое использование добулда? (Тернар?)
-
27-09-2019 - |
Вопрос
Кажется, что в Темнарном операторе есть какая-то путаница в тройке. Я знаю, что это было адресовано другим таким темам, но это всегда снуты. Кроме того, для моего случая я действительно просто ищу лучший путь.
Я хотел бы иметь возможность использовать
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
Но вместо этого я застрял с этим:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
Темнарный оператор терпит неудачу, потому что между DBNull и String нет никакой преобразования, а так же глупо, как это, кажется, рассматривая значение, является объектом, компилятор пинает его обратно ко мне, и я вынужден заботиться. Ответ на Nullable версию этого вопроса - просто отличить нуль на строку и сделать с ним; Добулл не может быть отброшен в строку, хотя, так что повезло там.
Есть ли более лаконичный способ сделать это (без нуля, кстати?)
Спасибо!
Решение
Вы можете изменить ваше первое утверждение:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
Другие советы
То Value
Собственность типа object
, так что вы должны бросить object
, нет string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
Или вы можете добавить метод расширения, такого как:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
И тогда вы могли бы просто сказать
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(Адаптированы из Фил Хак)
Читаемый и лаконичный, нет?
Как насчет использования ?? Оператор Null-Coalescing Подробнее о ?? оператор
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;