En javascript puede detectar si una propiedad está definida usando la palabra clave indefinida:
if( typeof data.myProperty == "undefined" ) ...
¿Cómo haría esto en C # usando la palabra clave dinámica con ExpandoObject
y sin lanzar una excepción?
c#
dynamic
expandoobject
Softlion
fuente
fuente
data.myProperty
; Comprueba lo quetypeof data.myProperty
vuelve. Es correcto quedata.myProperty
pueda existir y establecerse enundefined
, pero en ese caso,typeof
devolverá algo distinto de"undefined"
. Entonces este código funciona.Respuestas:
Según MSDN, la declaración muestra que está implementando IDictionary:
Puede usar esto para ver si un miembro está definido:
fuente
Una distinción importante debe hacerse aquí.
La mayoría de las respuestas aquí son específicas del ExpandoObject que se menciona en la pregunta. Pero un uso común (y una razón para aterrizar en esta pregunta cuando se busca) es cuando se usa ASP.Net MVC ViewBag. Esa es una implementación / subclase personalizada de DynamicObject, que no arrojará una excepción cuando verifique cualquier nombre de propiedad arbitrario para nulo. Suponga que puede declarar una propiedad como:
Luego, suponga que desea verificar su valor y si está configurado, si existe. Lo siguiente es válido, compilará, no arrojará ninguna excepción y le dará la respuesta correcta:
Ahora deshazte de la declaración de EnableThinger. El mismo código se compila y se ejecuta correctamente. No hay necesidad de reflexión.
A diferencia de ViewBag, ExpandoObject se lanzará si verifica nulo en una propiedad que no existe. Para sacar la funcionalidad más suave de MVC ViewBag de sus
dynamic
objetos, necesitará usar una implementación de dinámica que no arroje.Simplemente puede usar la implementación exacta en MVC ViewBag:
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DynamicViewDataDictionary.cs
Puede ver que está vinculado a MVC Views aquí, en MVC ViewPage:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ViewPage.cs
La clave del comportamiento elegante de DynamicViewDataDictionary es la implementación del Diccionario en ViewDataDictionary, aquí:
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/ViewDataDictionary.cs
En otras palabras, siempre devuelve un valor para todas las claves, independientemente de lo que contenga, simplemente devuelve nulo cuando no hay nada allí. Pero, ViewDataDictionary tiene la carga de estar atado al modelo de MVC, por lo que es mejor eliminar solo las elegantes partes del diccionario para usar fuera de las vistas de MVC.
Es demasiado tiempo para publicar realmente todas las agallas aquí, la mayoría solo implementando IDictionary, pero aquí hay un objeto dinámico (clase
DDict
) que no arroja controles nulos en propiedades que no se han declarado, en Github:https://github.com/b9chris/GracefulDynamicDictionary
Si solo desea agregarlo a su proyecto a través de NuGet, su nombre es GracefulDynamicDictionary .
fuente
Respondí una pregunta muy similar recientemente: ¿Cómo reflexiono sobre los miembros del objeto dinámico?
En breve, ExpandoObject no es el único objeto dinámico que puede obtener. Reflection funcionaría para tipos estáticos (tipos que no implementan IDynamicMetaObjectProvider). Para los tipos que implementan esta interfaz, la reflexión es básicamente inútil. Para ExpandoObject, simplemente puede verificar si la propiedad está definida como una clave en el diccionario subyacente. Para otras implementaciones, puede ser un desafío y, a veces, la única forma es trabajar con excepciones. Para más detalles, siga el enlace de arriba.
fuente
ACTUALIZADO: puede usar delegados e intentar obtener un valor de la propiedad del objeto dinámico si existe. Si no hay propiedad, simplemente captura la excepción y devuelve falso.
Echa un vistazo, me funciona bien:
La salida del código es la siguiente:
fuente
IsPropertyExist
. En este ejemplo, sabes que uno puede lanzar unInvalidOperationException
. En la práctica, no tienes idea de qué excepción se puede lanzar. +1 para contrarrestar el culto a la carga.Quería crear un método de extensión para poder hacer algo como:
... pero no puede crear extensiones de
ExpandoObject
acuerdo con la documentación de C # 5 (más información aquí ).Así que terminé creando un ayudante de clase:
Para usarlo:
fuente
¿Por qué no desea utilizar Reflection para obtener un conjunto de tipos de propiedad sí? Me gusta esto
fuente
Este método de extensión verifica la existencia de una propiedad y luego devuelve el valor o nulo. Esto es útil si no desea que sus aplicaciones arrojen excepciones innecesarias, al menos las que puede ayudar.
Si se puede usar como tal:
o si su variable local es 'dinámica', primero deberá convertirla a ExpandoObject.
fuente
Dependiendo de su caso de uso, si puede considerarse que nulo es igual a indefinido, puede convertir su ExpandoObject en un DynamicJsonObject.
Salida:
fuente
fuente
Hola chicos, dejen de usar Reflection para todo lo que cuesta muchos ciclos de CPU.
Aquí está la solución:
fuente
Prueba este
fuente
dynamic
objetos (siempre regresanull
).