如何获取动态类型的属性值,其中属性名称在C#中的变量中



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

string json = "{"key1":"value1", "key2": "value2"}";
dynamic d = JObject.Parse(json);
Console.WriteLine("Key1 : " + d.key1); //value1

上面的代码按预期工作,但如何通过存储在变量中的名称使用get属性来获取值?

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)抛出异常Cannot perform runtime binding on a null reference

或者,如果这个问题有其他解决方案的话。

它必须使用反射吗?你知道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

和类似的:

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

相关内容

  • 没有找到相关文章

最新更新