我从C#调用REST端点,我收到json,它被序列化为一个对象.此对象的一个属性是动态属性.动态属性的值在服务器站点上设置为匿名对象,如下所示:
myObject.MyDynamicProp = new { Id = "MyId2134",Name = "MyName" };
在客户端站点上,json序列化的动态属性值是一个包含以下值的JObject:@H_404_5@
{{ "id": "MyId2134","Name": "MyName" }}
var s = myObject.MyDynamicProp.Name;
但它没有找到Name属性,而是我必须得到这样的值:@H_404_5@
var s = myObject.MyDynamicProp["Name"].Value;
我尝试将JObject转换为这样的动态对象,但它返回JObject:@H_404_5@
var dyn = myObject.MyDynamicProp.ToObject<dynamic>();
如何转换动态属性值,以便我可以直接调用其属性?@H_404_5@
var s = myObject.MyDynamicProp.Name;
更新……@H_404_5@
我跑了以下@H_404_5@
dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\",\"Name\": \"MyName\"}}"); string name = d.MyDynamicProp.Name;
{Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: `Newtonsoft.Json.Linq.JObject' does not contain a definition for `MyDynamicProp' at Microsoft.Scripting.Interpreter.ThrowInstruction.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00027]
我想补充一点,这是一个Xamarin iOS项目,代码位于PCL库中.@H_404_5@
我假设我的代码有问题,但看起来在Xamarin iOS项目中不可能使用动态类型.
https://developer.xamarin.com/guides/ios/advanced_topics/limitations/@H_404_5@
解决方法
实际上很容易.而不是在你的JObject上使用var use dynamic,你会没事的:
dynamic do = myObject.MyDynamicProp; string name = do.Name;
从您的片段:@H_404_5@
dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\",\"Name\": \"MyName\"}}"); string name = d.MyDynamicProp.Name; Console.WriteLine(name); // writes MyName
为什么会这样:正如Richard所解释的那样,JObject间接地从实现IDynamicMetaObjectProvider
的JToken派生.正是那个允许动态工作的接口.@H_404_5@