我想用一个字符串访问一个动态c#属性的值:
动态d = new {value1 = "some", value2 = "random", value3 = "value"};
如果我只有“value2”作为字符串,我如何才能得到d.value2(“random”)的值?在javascript中,我可以做d["value2"]来访问值("random"),但我不确定如何用c#和反射来做到这一点。我最接近的说法是:
“value2”d.GetType () . getproperty()……但我不知道如何从中获得实际价值。
一如既往,谢谢你的帮助!
在Newtonsoft.Json.JsonConvert.DeserializeObject中使用dynamic:
// Get JSON string of object
var obj = new { value1 = "some", value2 = "random", value3 = "value" };
var jsonString = JsonConvert.SerializeObject(obj);
// Use dynamic with JsonConvert.DeserializeObject
dynamic d = JsonConvert.DeserializeObject(jsonString);
// output = "some"
Console.WriteLine(d["value1"]);
示例:
https://dotnetfiddle.net/XGBLU1
public static object GetProperty(object target, string name)
{
var site = System.Runtime.CompilerServices.CallSite<Func<System.Runtime.CompilerServices.CallSite, object, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, name, target.GetType(), new[]{Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(0,null)}));
return site.Target(site, target);
}
添加对Microsoft.CSharp的引用。也适用于动态类型和私有属性和字段。
编辑:虽然这种方法是有效的,但是从Microsoft.VisualBasic.dll程序集中可以找到几乎快20倍的方法:
public static object GetProperty(object target, string name)
{
return Microsoft.VisualBasic.CompilerServices.Versioned.CallByName(target, name, CallType.Get);
}