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

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

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

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

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


当前回答

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

    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)
        {

        }


    }

其他回答

一些解决方案不是工作的valuekind对象,我从一个json字符串获得的,也许是因为我没有一个具体的类型在我的代码,类似于对象,我将从json字符串获得,所以我是如何去做的

JsonElement myObject = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(jsonStringRepresentationOfMyObject);

/*In this case I know that there is a property with 
the name Code, otherwise use TryGetProperty. This will 
still return a JsonElement*/

JsonElement propertyCode = myObject.GetProperty("Code");
        
/*Now with the JsonElement that represents the property, 
you can use several methods to retrieve the actual value, 
in this case I know that the value in the property is a string, 
so I use the GetString method on the object. If I knew the value 
was a double, then I would use the GetDouble() method on the object*/

string code = propertyCode.GetString();

这对我很有用

在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

Dynamitey是一个开源的。net std库,让你像动态关键字一样调用它,但是使用一个字符串作为属性名,而不是编译器为你做它,它最终等于反射速度(这几乎不如使用动态关键字快,但这是由于动态缓存的额外开销,其中编译器静态缓存)。

Dynamic.InvokeGet(d,"value2");

在。net core 3.1中,你可以这样尝试

d?.value2 , d?.value3

GetProperty/GetValue对Json数据不起作用,它总是生成一个空异常,但是,你可以尝试这种方法:

使用JsonConvert序列化你的对象:

var z = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(request));

然后直接访问它,将其转换回string:

var pn = (string)z["DynamicFieldName"];

它可以直接应用Convert.ToString(request)["DynamicFieldName"],但我还没有测试。