我想用一个字符串访问一个动态c#属性的值:

动态d = new {value1 = "some", value2 = "random", value3 = "value"};

如果我只有“value2”作为字符串,我如何才能得到d.value2(“random”)的值?在javascript中,我可以做d["value2"]来访问值("random"),但我不确定如何用c#和反射来做到这一点。我最接近的说法是:

“value2”d.GetType () . getproperty()……但我不知道如何从中获得实际价值。

一如既往,谢谢你的帮助!


当前回答

类似于接受的答案,您也可以尝试GetField而不是GetProperty。

d.GetType().GetField(“value2”).获取值(d);

这取决于实际的Type是如何实现的,当GetProperty()不起作用时,它可以工作,甚至可以更快。

其他回答

一旦你有了你的PropertyInfo(从GetProperty),你需要调用GetValue并传递你想要从中获取值的实例。在你的情况下:

d.GetType().GetProperty("value2").GetValue(d, null);

类似于接受的答案,您也可以尝试GetField而不是GetProperty。

d.GetType().GetField(“value2”).获取值(d);

这取决于实际的Type是如何实现的,当GetProperty()不起作用时,它可以工作,甚至可以更快。

d . GetType () GetProperty (value2”)。

返回PropertyInfo对象。

那就做吧

propertyInfo.GetValue(d)

这是我得到一个动态的属性值的方法:

    public dynamic Post(dynamic value)
    {            
        try
        {
            if (value != null)
            {
                var valorCampos = "";

                foreach (Newtonsoft.Json.Linq.JProperty item in value)
                {
                    if (item.Name == "valorCampo")//property name
                        valorCampos = item.Value.ToString();
                }                                           

            }
        }
        catch (Exception ex)
        {

        }


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