Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取属性名位于C中变量中的动态类型的属性值#_C#_Dynamic_Json.net - Fatal编程技术网

C# 如何获取属性名位于C中变量中的动态类型的属性值#

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

我试图获取动态对象的属性值。json字符串被解析/反序列化为一个动态对象,然后我想通过名称后跟get值来访问该属性

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