C# 如何获取属性名位于C中变量中的动态类型的属性值#
我试图获取动态对象的属性值。json字符串被解析/反序列化为一个动态对象,然后我想通过名称后跟get值来访问该属性C# 如何获取属性名位于C中变量中的动态类型的属性值#,c#,dynamic,json.net,C#,Dynamic,Json.net,我试图获取动态对象的属性值。json字符串被解析/反序列化为一个动态对象,然后我想通过名称后跟get值来访问该属性 string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}"; dynamic d = JObject.Parse(json); Console.WriteLine("Key1 : " + d.key1); //value1 上面的代码按预期工作,但如何使用存储在变量中的get property by name获取值 st
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}";
dynamic d = JObject.Parse(json);
Console.WriteLine("Key1 : " + d.key1); //value1
上面的代码按预期工作,但如何使用存储在变量中的get property by name获取值
string jsonKey = "key2";
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}";
dynamic d = JObject.Parse(json);
var jsonValue = d.GetType().GetProperty(jsonKey).GetValue(d, null); //throws exception - Cannot perform runtime binding on a null reference
Console.WriteLine("jsonValue : " + jsonValue);
GetProperty(jsonKey)
抛出异常无法对空引用执行运行时绑定
或者,如果有解决此问题的替代方案。以及类似以下内容:
JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");
就像这样:
JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");
它必须使用反射吗?您知道JObject.Parse将返回JObject,因此您可以看到什么是公共方法/属性。您可以看到,它没有公开JSON的公共属性,因此无法获取该值 有几种方法可以在不进行反射的情况下获取值:
string jsonKey = "key2";
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}";
dynamic d = JObject.Parse(json);
string jsonValue1 = d.Value<string>(jsonKey); // one way
string jsonValue2 = (string)d[jsonKey]; // another way
string jsonKey=“key2”;
字符串json=“{\'key1\':\'value1\',\'key2\':\'value2\'”;
动态d=JObject.Parse(json);
字符串jsonValue1=d.Value(jsonKey);//单程
字符串jsonValue2=(字符串)d[jsonKey];//另一种方式
它必须使用反射吗?您知道JObject.Parse将返回JObject,因此您可以看到什么是公共方法/属性。您可以看到,它没有公开JSON的公共属性,因此无法获取该值
有几种方法可以在不进行反射的情况下获取值:
string jsonKey = "key2";
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}";
dynamic d = JObject.Parse(json);
string jsonValue1 = d.Value<string>(jsonKey); // one way
string jsonValue2 = (string)d[jsonKey]; // another way
string jsonKey=“key2”;
字符串json=“{\'key1\':\'value1\',\'key2\':\'value2\'”;
动态d=JObject.Parse(json);
字符串jsonValue1=d.Value(jsonKey);//单程
字符串jsonValue2=(字符串)d[jsonKey];//另一种方式
此方法的替代方法可能是使用F#类型提供程序(可能打包到一个单独的程序集中,上面有一个API)。此方法的替代方法可能是使用F#类型提供程序(可能打包到一个单独的程序集中,上面有一个API)。