You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure函数两段dynamic代码差异疑问:失败与正常代码对比

为什么两段dynamic代码一个失败一个工作?

嘿,这个问题核心在于dynamic变量背后实际的类型以及ReadAsAsync<object>的真实行为,我给你拆解明白:

先看标注“//this fails”的代码

dynamic abc = (object) @"{""name"":""test""}";
string test = abc?.name;

这段代码里,你只是把一个JSON格式的字符串强制转换成了object类型,再赋值给dynamic变量。本质上abc的实际类型还是string——dynamic只是让编译器延迟类型检查,但运行时CLR会去string类里找name属性,而string根本没有这个成员,所以运行时会抛出RuntimeBinderException(也就是你说的“fails”)。

再看标注“//this works”的代码

dynamic data = await req.Content.ReadAsAsync<object>();
name = data?.name;

这里你误解了ReadAsAsync<object>的返回值:它没有返回普通的object实例!默认情况下,这个方法会用JSON序列化器(通常是Json.NET)把请求体的JSON内容反序列化成一个支持动态属性访问的JSON对象(比如JObject或者ExpandoObject)。这些类型本质是键值对结构,当你用data?.name时,CLR会在这些结构里查找对应的键name,自然能拿到对应的属性值。

验证修正:让“失败”的代码工作

如果你想让第一段代码也能访问name属性,需要把JSON字符串反序列化成动态JSON对象,而不是直接转成object:

// 用Json.NET反序列化后,abc就变成了支持动态访问的JObject
dynamic abc = Newtonsoft.Json.JsonConvert.DeserializeObject(@"{""name"":""test""}");
string test = abc?.name; // 现在test会正确拿到"test"

总结一下:两者的核心差异是dynamic变量背后的实际类型——一个是普通字符串,一个是能解析JSON键值对的动态对象。

内容的提问来源于stack exchange,提问作者codeputer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:46:27