2010-08-09 9 views
7

Parece que hay algún tipo de confusión en el operador ternario. Sé que esto se ha abordado en otros hilos SO, pero siempre ha sido con elementos inactivables. Además, en mi caso, realmente estoy buscando una mejor manera.¿Uso conciso de DBNull? (¿Ternario?)

Me gustaría ser capaz de utilizar

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id; 

sino que estoy atascado con esto:

if (string.IsNullOrEmpty(dest.Id)) 
{ 
    proc.Parameters[PARAM_ID].Value = DBNull.Value; 
} 
else 
{ 
    proc.Parameters[PARAM_ID].Value = dest.Id; 
} 

El operador ternario falla porque no hay conversión posible entre DBNull y la cadena, y por más tonto que parezca, teniendo en cuenta que el valor es un objeto, el compilador me lo devuelve y me veo obligado a preocuparme. La respuesta a la versión que admite nulos de esta pregunta es simplemente lanzar nulo a la cadena y terminar con ella; Sin embargo, DBNull no se puede convertir en una cadena, así que no tuvimos suerte allí.

¿Hay una manera más concisa para hacer esto (sin utilizar nullables, por cierto?)

Gracias!

Respuesta

19

Usted puede cambiar su primera declaración a:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id; 
+4

Oh. Duh. Y eso es para lo que stackoverflow es. ¡Gracias! – bwerks

6

La propiedad Value es de tipo object, por lo que debe emitir a object, no string:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id) 
    ? (object)DBNull.Value 
    : (object)dest.Id; 
+0

voy a dar la respuesta a Jacob, ya que al parecer respondió por primera vez por unos 20 segundos. ¡Gracias a ti también! – bwerks

+0

@bwerks Creo que leíste las marcas de tiempo al revés. ;) – Dan

6

o usted podría agregar una extensión método como:

public static class DBNullExtensions 
{ 
    public static object AsDBNullIfEmpty(this string value) 
    { 
     if (String.IsNullOrEmpty(value)) 
     { 
      return DBNull.Value; 
     } 
     return value; 
    } 
} 

Y entonces se podría simplemente decir

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty(); 

(Adaptado de Phil Haack)

legible y conciso, no?

+0

Excavo el uso de métodos de extensión; lamentablemente este proyecto está en C# 2.0 sin embargo. Boo siseo. – bwerks

+3

¡Bummer! Tal vez puedas cincelar algo con obeliscos de piedra;) –

3

¿Qué pasa con el ?? null-coalescencia operador More details about ?? operator

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value; 
+0

Operador '??' no se puede aplicar al tipo 'bool' y 'objeto'. Si elimina '(objeto)', el compilador se quejará del tipo 'DBNull' en lugar de 'objeto'. – ivorykoder

+0

@ivorykoder el ?? operador solo puede usarse en tipos anulables, como 'lhs ?? rhs' es esencialmente equivalente a 'lhs! = null? lhs: rhs'. Es por eso que estás obteniendo "no se puede aplicar al tipo 'bool'" - ¡'bool' no se puede anular! – FireSBurnsmuP