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