Вопрос

Кажется, что в Темнарном операторе есть какая-то путаница в тройке. Я знаю, что это было адресовано другим таким темам, но это всегда снуты. Кроме того, для моего случая я действительно просто ищу лучший путь.

Я хотел бы иметь возможность использовать

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top