2012-03-06 9 views
5

Tengo un código que funciona con ExpandoObjects poblado por llamadas a la base de datos. Invariablemente, algunos de los valores son nulos. Cuando miro los objetos como un ExpandoObject, veo todas las claves y valores (nulos incluidos) en el diccionario subyacente. Pero si intento acceder a ellos a través de una referencia dinámica, cualquier clave que tenga un valor nulo correspondiente no aparecerá en la vista dinámica del objeto. Obtengo una ArgumentNullException cuando intento acceder a ella a través de la sintaxis de la propiedad en la referencia dinámica.Vista dinámica de ExpandoObjects "oculta" Propiedades con valores nulos

Sé que podría evitar esto trabajando directamente con un ExpandoObject, agregando un montón de capturas de prueba, mapeando el expando a un tipo concreto, etc., pero ese tipo de derrota el propósito de tener este objeto dinámico en el primer lugar. El código que consume el objeto dyanmico funcionaría bien si algunas de las propiedades tuvieran valores nulos. ¿Hay alguna forma más elástica o sucinta de "mostrar" estas propiedades dinámicas que tienen valores nulos?

Aquí está el código que demuestra mi "problema"

dynamic dynamicRef = new ExpandoObject(); 
ExpandoObject expandoRef = dynamicRef; 

dynamicRef.SimpleProperty = "SomeString"; 
dynamicRef.NulledProperty = null; 

string someString1 = string.Format("{0}", dynamicRef.SimpleProperty); 

// My bad; this throws because the value is actually null, not because it isn't 
// present. Set a breakppoint and look at the quickwatch on the dynamicRef vs. 
// the expandoRef to see why I let myself be led astray. NulledProperty does not 
// show up in the Dynamic View of the dynamicRef 
string someString2 = string.Format("{0}", dynamicRef.NulledProperty); 
+0

ExpandoObject puede almacenar valores nulos, y sacarlos, ¿está seguro de qué está causando el argumento de excepción nula? – jbtule

+1

Si la clave está presente en el 'ExpandoObject', la devolverá ya sea' null' o no. Si no está presente, arrojará una 'RuntimeBinderException'. No arrojará 'ArgumentNullException', por lo que debe haber algún error en su código. ¿Podrías mostrarnos el código que arroja? – svick

+0

OK, creo que la ventana de observación de Visual Studio me está engañando. El código arroja una ArgumentNullException porque el valor es realmente nulo, no porque la propiedad "falta". Cuando configuro un reloj en la referencia dinámica, no muestra la propiedad si tiene un valor nulo. Si pongo un reloj viendo la referencia de ExpandoObject al mismo objeto, muestra el nombre de la propiedad en la lista de claves subyacente. –

Respuesta

3

El problema que tiene es que la invocación dinámica sobrecarga de tiempo de ejecución es recoger string .Format(format, params object[] args) en lugar de la string.Format(string format, object arg0) previsto un molde sencillo cambiará a una invocación estática de string.Format y arreglarlo

string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty); 
+0

¡Perfecto! Eso lo cuidó. –

Cuestiones relacionadas