Si IDynamicMetaObjectProvider puede proporcionar los nombres de miembros dinámicos, puede obtenerlos. Consulte la implementación de GetMemberNames en la biblioteca PCL con licencia de Apache Dynamitey (que se puede encontrar en nuget), funciona para ExpandoObject
sy DynamicObject
s que implementanGetDynamicMemberNames
y cualquier otro IDynamicMetaObjectProvider
que proporciona un objeto meta con una implementación de GetDynamicMemberNames
sin allá de las pruebas personalizadais IDynamicMetaObjectProvider
.
Después de obtener los nombres de los miembros, es un poco más de trabajo obtener el valor de la manera correcta, pero Impromptu hace esto, pero es más difícil señalar solo las partes interesantes y tener sentido. Aquí está la documentación y es igual o más rápido que la reflexión, sin embargo, es poco probable que sea más rápido que una búsqueda de diccionario para expando, pero funciona para cualquier objeto, expando, dinámico u original, lo que sea.
En el caso de ExpandoObject, la clase ExpandoObject realmente implementa
IDictionary<string, object>
sus propiedades, por lo que la solución es tan trivial como la conversión:Tenga en cuenta que esto no funcionará para objetos dinámicos generales. En estos casos, deberá desplegar el DLR a través de IDynamicMetaObjectProvider.
fuente
Hay varios escenarios a considerar. En primer lugar, debe verificar el tipo de su objeto. Simplemente puede llamar a GetType () para esto. Si el tipo no implementa IDynamicMetaObjectProvider, puede usar la misma reflexión que para cualquier otro objeto. Algo como:
Sin embargo, para las implementaciones de IDynamicMetaObjectProvider, la reflexión simple no funciona. Básicamente, necesita saber más sobre este objeto. Si es ExpandoObject (que es una de las implementaciones de IDynamicMetaObjectProvider), puede usar la respuesta proporcionada por itowlson. ExpandoObject almacena sus propiedades en un diccionario y simplemente puede convertir su objeto dinámico en un diccionario.
Si se trata de DynamicObject (otra implementación de IDynamicMetaObjectProvider), debe utilizar los métodos que expone este DynamicObject. DynamicObject no está obligado a "almacenar" su lista de propiedades en ninguna parte. Por ejemplo, podría hacer algo como esto (estoy reutilizando un ejemplo de mi publicación de blog ):
En este caso, cada vez que intente acceder a una propiedad (con cualquier nombre), el objeto simplemente devuelve el nombre de la propiedad como una cadena.
Por lo tanto, no tiene nada sobre lo que reflexionar: este objeto no tiene ninguna propiedad y, al mismo tiempo, funcionarán todos los nombres de propiedad válidos.
Diría que para las implementaciones de IDynamicMetaObjectProvider, debe filtrar las implementaciones conocidas donde puede obtener una lista de propiedades, como ExpandoObject, e ignorar (o lanzar una excepción) para el resto.
fuente
Requiere Newtonsoft Json.Net
Un poco tarde, pero se me ocurrió esto. Le da solo las claves y luego puede usarlas en la dinámica:
Entonces simplemente predicas así:
Eligiendo obtener el valor como una cadena u otro objeto, o hacer otra dinámica y usar la búsqueda nuevamente.
fuente
JObject attributesAsJObject = dynamicToGetPropertiesFor;
con algo como:var jObject = (JObject) JToken.FromObject(dynamicToGetPropertiesFor);
. En ese punto, puede obtener un diccionario de nombres y valores de propiedades haciendo algo comovar objProperties = jObject.ToObject<Dictionary<string, object>>();
. Con eso en mano, te vas a las carreras. Esto no necesita una dinámica. Funciona bien con cualquier cosa que sea una subclase deDynamicObject