假设我有一个动态变量:
dynamic d = *something*
现在,我d
从字符串数组创建我拥有的属性:
string[] strarray = { 'property1','property2',..... }
我事先不知道属性名称。
d
创建代码并将strarray从数据库中提取后,如何在代码中获取值?
我想得到d.property1 , d.property2
。
我看到该对象有一个_dictionary
内部字典,其中包含键和值,如何检索它们?
假设我有一个动态变量:
dynamic d = *something*
现在,我d
从字符串数组创建我拥有的属性:
string[] strarray = { 'property1','property2',..... }
我事先不知道属性名称。
d
创建代码并将strarray从数据库中提取后,如何在代码中获取值?
我想得到d.property1 , d.property2
。
我看到该对象有一个_dictionary
内部字典,其中包含键和值,如何检索它们?
something
在调试器中检查的运行时类型,并查看其公共成员。
d.GetType()
在运行时给您带来什么吗?
Answers:
我不知道动态创建的对象是否有更优雅的方法,但是使用普通的旧反射应该可以:
var nameOfProperty = "property1";
var propertyInfo = myObject.GetType().GetProperty(nameOfProperty);
var value = propertyInfo.GetValue(myObject, null);
GetProperty
null
如果类型myObject
不包含具有此名称的公共属性,则将返回。
编辑:如果对象不是“常规”对象,而是实现的对象IDynamicMetaObjectProvider
,则此方法将不起作用。请改看这个问题:
这将为您提供动态变量中定义的所有属性名称和值。
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);
}
希望这对您有帮助:
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);
}
}
使用以下代码获取动态对象属性的名称和值。
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
}
PSObject
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#动态对象中吗? +在其中的代码中将_dictionary变量从“专用只读”更改为公用
您看到ExpandoObject类了吗?
直接来自MSDN描述:“表示一个对象,其成员可以在运行时动态添加和删除。”
有了它,您可以编写如下代码:
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
ExpandoObject
一样PSObject
。
认为这可能会在将来对某人有所帮助。
如果您已经知道属性名称,则可以执行以下操作:
[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;
}
something
的IDynamicMetaObjectProvider
?