从string(reflection?)从C#dynamic对象获取属性值

假设我有一个dynamicvariables:

dynamic d = *something* 

现在, 东西创build属性到d我有另一方面从string数组:

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

我不提前知道属性名称。

如何在代码中,一旦d被创build,并从数据库拉strarray,我可以得到的价值?

我想得到d.property1 , d.property2

我看到该对象有一个_dictionary内部字典,其中包含键和值,我如何_dictionary他们?

非常感谢您的帮助!

我不知道dynamic创build的对象是否有一个更优雅的方式,但使用普通的旧的reflection应该工作:

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

如果myObject的types不包含具有该名称的公共属性,则GetProperty将返回null


编辑 :如果对象不是“常规”的对象,但实现IDynamicMetaObjectProvider东西,这种方法将无法正常工作。 请看看这个问题,而不是:

  • 我如何反思dynamic对象的成员?

希望这会帮助你:

 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); } } 

这会给你所有在你的dynamicvariables中定义的属性名和值。

 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); } 
 string json = w.JSON; var serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); DynamicJsonConverter.DynamicJsonObject obj = (DynamicJsonConverter.DynamicJsonObject)serializer.Deserialize(json, typeof(object)); 

现在obj._Dictionary包含一个字典。 完善!

这段代码必须与反序列化JSON一起使用到C#dynamic对象中吗? +使_dictionaryvariables从“private readonly”公开在代码中

你看到ExpandoObject类吗?

直接从MSDN描述 :“代表一个对象,其成员可以在运行时dynamic添加和删除”。

有了它,你可以编写这样的代码:

 dynamic employee = new ExpandoObject(); employee.Name = "John Smith"; ((IDictionary<String, Object>)employee).Remove("Name"); 

以为这可能会帮助未来的人。

如果您已经知道属性名称,则可以执行以下操作:

 [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; }