Obtiene el valor de propiedad del objeto dynamic C # por cadena (¿reflexión?)

Supongamos que tengo una variable dinámica:

dynamic d = *something* 

Ahora, algo crea propiedades para d que tengo, por otro lado, de una matriz de cadenas:

 string[] strarray = { 'property1','property2',..... } 

No sé los nombres de las propiedades por adelantado.

¿Cómo en el código, una vez que se crea d y se saca strarray de DB, puedo obtener los valores?

Quiero obtener d.property1 , d.property2 .

Veo que el objeto tiene un diccionario interno _dictionary que contiene las claves y los valores, ¿cómo los recupero?

No sé si hay una manera más elegante con los objetos creados dinámicamente, pero el uso de la antigua reflexión debería funcionar:

 var nameOfProperty = "property1"; var propertyInfo = myObject.GetType().GetProperty(nameOfProperty); var value = propertyInfo.GetValue(myObject, null); 

GetProperty devolverá null si el tipo de myObject no contiene una propiedad pública con este nombre.


EDITAR : si el objeto no es un objeto “regular” sino algo que implementa IDynamicMetaObjectProvider , este enfoque no funcionará. Por favor, eche un vistazo a esta pregunta en su lugar:

  • ¿Cómo reflexiono sobre los miembros del objeto dynamic?

Esto le dará todos los nombres de propiedades y valores definidos en su variable dinámica.

 dynamic d = { // your code }; object o = d; string[] propertyNames = o.GetType().GetProperties().Select(p => p.Name).ToArray(); foreach (var prop in propertyNames) { object propValue = o.GetType().GetProperty(prop).GetValue(o, null); } 

Espero que esto te ayude:

 public static object GetProperty(object o, string member) { if(o == null) throw new ArgumentNullException("o"); if(member == null) throw new ArgumentNullException("member"); Type scope = o.GetType(); IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider; if(provider != null) { ParameterExpression param = Expression.Parameter(typeof(object)); DynamicMetaObject mobj = provider.GetMetaObject(param); GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[]{CSharpArgumentInfo.Create(0, null)}); DynamicMetaObject ret = mobj.BindGetMember(binder); BlockExpression final = Expression.Block( Expression.Label(CallSiteBinder.UpdateLabel), ret.Expression ); LambdaExpression lambda = Expression.Lambda(final, param); Delegate del = lambda.Compile(); return del.DynamicInvoke(o); }else{ return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null); } } 
 string json = w.JSON; var serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); DynamicJsonConverter.DynamicJsonObject obj = (DynamicJsonConverter.DynamicJsonObject)serializer.Deserialize(json, typeof(object)); 

Ahora obj._Dictionary contiene un diccionario. ¡Perfecto!

Este código se debe usar junto con Deserialize JSON en C # dynamic object? + hacer que la variable _dictionary de “private readonly” a public en el código allí

¿ Viste la clase ExpandoObject ?

Directamente desde la descripción de MSDN : “Representa un objeto cuyos miembros se pueden agregar y eliminar dinámicamente en el tiempo de ejecución”.

Con él puedes escribir código como este:

 dynamic employee = new ExpandoObject(); employee.Name = "John Smith"; ((IDictionary)employee).Remove("Name"); 

Si d fue creado por Newtonsoft, puede usarlo para leer los nombres y valores de las propiedades:

  foreach (JProperty property in d) { DoSomething(property.Name, property.Value); } 

Pensé que esto podría ayudar a alguien en el futuro.

Si ya conoce el nombre de la propiedad, puede hacer algo como lo siguiente:

 [HttpPost] [Route("myRoute")] public object SomeApiControllerMethod([FromBody] dynamic args){ var stringValue = args.MyPropertyName.ToString(); //do something with the string value. If this is an int, we can int.Parse it, or if it's a string, we can just use it directly. //some more code here.... return stringValue; } 

Use el siguiente código para obtener el Nombre y el Valor de la propiedad de un objeto dynamic.

 dynamic d = new { Property1= "Value1", Property2= "Value2"}; var properties = d.GetType().GetProperties(); foreach (var property in properties) { var PropertyName=property.Name; //You get "Property1" as a result var PropetyValue=d.GetType().GetProperty(property.Name).GetValue(d, null); //You get "Value1" as a result // you can use the PropertyName and Value here }