最新要闻
- 天天新资讯:郭帆谈《流浪地球2》“50岁以上出列”拍摄:喊停了外国群演还在哭
- 全球短讯!给蚊子送上夏天第一拍!雅格电蚊拍大促:10.9元到手
- 今日要闻!迪士尼正版授权 泰国乳胶凉席三件套大促!原价190 券后90
- 远大前程多少集_远大前程介绍
- 全球热资讯!《寂静岭2:重制版》美术谈护士穿丝袜:曾被指责皮肤暴露
- 最尴尬的新造车:称车主可活100岁 碰撞测试得分0
- 50吨!山东探获一大型金矿床:服务年限可达20年以上
- 天天报道:博主带卷尺吃披萨发现尺寸不够:99元12寸披萨直径少2.5厘米
- 女子称点外卖备注送上楼被骑手教育:四块钱还想让送上楼
- 三亚骂游客导游被吊销导游证罚款5万:网友点赞 低价团慎重参与
- 重庆东站一项目招标条件被指“量身定做”:招标人答疑,公管局正处理投诉
- 环球热门:马龙樊振东会师决赛:国乒包揽大满贯5冠
- 当前热议!俞敏洪谈野生虾事件:犯了错误 就要去改正
- 世界最资讯丨情侣称住41层酒店被“玻璃人”看光引热议:网友支持酒店已提示
- 全球讯息:职工医保报销比例2022_职工医保报销比例
- 全球观点:OpenAI CEO谈GPT4:人类迄今开发的最伟大技术 有点害怕了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【世界热闻】探究C# dynamic动态类型本质
本周在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类?比如由
(资料图片)
{ "userId": 100, "id": 1, "title": "hello world", "completed": false}
生成
dynamic obj = new{ userId = 100, id = 1, title = "hello world", completed = false,};
解决这个问题前,我们先来了解一下dynamic
动态类型。
动态类型是什么?
首先动态类型是静态类,不是一种称之为“动态”的类型,只不过这个类型的对象会跳过静态类型检查。也就是在编译过程中不报错,但是运行程序将对象初始化之后,它该是什么类型,那么还是什么类型。
看个例子,有两个动态类型obj1
,obj2
dynamic obj1 = new{ userId = 100, id = 1, title = "hello world", completed = false,};dynamic obj2 = new System.Dynamic.ExpandoObject();result.userId = 100;result.id = 1;result.title = "hello world";result.completed = false;Console.WriteLine("---obj1---");Console.WriteLine(obj1.userId);Console.WriteLine(obj1.id);Console.WriteLine(obj1.title);Console.WriteLine(obj1.completed);Console.WriteLine("\n---obj2---");Console.WriteLine(obj2.userId);Console.WriteLine(obj2.id);Console.WriteLine(obj2.title);Console.WriteLine(obj2.completed);
运行结果如下
他们输出的结果一样,但你认为他们的返回结果是一样的吗?obj1
是一个类型为AnonymousType
的匿名类,我们可以很轻松地通过反射的方式遍历其成员变量:
Type t = obj1.GetType();PropertyInfo[] pi = t.GetProperties();foreach (PropertyInfo p in pi){ var key = p.Name; var value = p.GetValue(obj1, null); Console.WriteLine(key + ": " + value);}
打印如下:
userId: 100id: 1title: hello worldcompleted: False
而obj2
则是System.Dynamic.ExpandoObject
类型的对象,而且从初始化到对象生命周期结束。始终是这个类型。
我们对obj2
运行同样的代码,发现会报错
Type t = obj2.GetType();PropertyInfo[] pi = t.GetProperties();foreach (PropertyInfo p in pi){ var key = p.Name; var value = p.GetValue(obj1, null); Console.WriteLine(key + ": " + value);}
报错的原因是obj2
并不包含真正的userId
成员变量,因为其本质是个ExpandoObject
对象,
可见dynamic
关键字并不会改变C#变量在运行时的类型,它仅仅是在编译阶段跳过了静态类型检查。
动态类型的特点是什么?
然而你是可以通过重新赋值改变类型的,当然这是公共语言运行时 (CLR) 提供的动态技术。
dynamic number = 1;Console.WriteLine(number.GetType()); //输出System.Intnumber = "text";Console.WriteLine(number.GetType()); //输出System.String
当我用ILspy反编译工具查看IL源码的时候,竟发现number
变量的类型是object
,也就是整个过程经过了装箱拆箱,经过了从内存栈创建地址引用到堆中区域的改变。dynamic
帮我们完成了这些动作。所以本质上内存中同一个对象不会平白无故从int
类型转换为string
。毕竟C#不能像其他弱类型语言那样使用。
obj1
匿名类的成员变量是只读的。给它赋一个其他类型的值,将会报错;而给obj2
的成员变量赋其他类型的值,则不会报错。
obj1.userId = "100"; //运行时报错obj2.userId = "100";
在来看obj2,因为System.Dynamic.ExpandoObject
类型因实现了 IDynamicMetaObjectProvider
因此它能通过.成员变量
的方式访问内容。
又因为System.Dynamic.ExpandoObject
实现了IDictionary
因此可以通过向字典添加KeyValue对象的形式向ExpandoObject
对象添加成员变量,用[key]
方式访问内容。代码如下
foreach (var entry in obj1){ (obj2 as IDictionary).Add(entry.Key, entry.Value.ToString());}
通过.成员变量
的方式访问内容,可以说这是伪装的成员变量。但稍微一测试,就露馅了。
动态类型如何用?
现在我们来回答“如何把一个json字符串,转成C#动态类”这个问题,答案是做不到。
首先用Newtonsoft.Json
库转换的结果,无论是用JObject.Parse(json)
还是JsonConvert.DeserializeObject(json)
最后返回的结果是JToken
类型的对象,通过反编译Newtonsoft.Json.dll
,查看JToken
类型,可见它还是一个继承了IDictionary
和IDynamicMetaObjectProvider
的类型,
string json = @"{ "userId": 100, "id": 1, "title": "hello world", "completed": false}";var obj1 = JObject.Parse(json);dynamic obj2 = new System.Dynamic.ExpandoObject();foreach (var entry in obj1){ (obj2 as IDictionary).Add(entry.Key, entry.Value.ToString());}
运行如上同样的代码检查obj2
Type t = obj2.GetType();PropertyInfo[] pi = t.GetProperties();foreach (PropertyInfo p in pi){ var key = p.Name; var value = p.GetValue(obj1, null); Console.WriteLine(key + ": " + value);}
可以通过这样向obj2
动态添加成员变量,但是始终是字典方式提供的伪对象。
关键词:
【世界热闻】探究C# dynamic动态类型本质
天天新资讯:郭帆谈《流浪地球2》“50岁以上出列”拍摄:喊停了外国群演还在哭
全球短讯!给蚊子送上夏天第一拍!雅格电蚊拍大促:10.9元到手
今日要闻!迪士尼正版授权 泰国乳胶凉席三件套大促!原价190 券后90
检查 Linux 系统是运行在虚拟机上还是物理机上
远大前程多少集_远大前程介绍
全球热资讯!《寂静岭2:重制版》美术谈护士穿丝袜:曾被指责皮肤暴露
最尴尬的新造车:称车主可活100岁 碰撞测试得分0
50吨!山东探获一大型金矿床:服务年限可达20年以上
世界视点!读Java性能权威指南(第2版)笔记21_垃圾回收H
优化利器In-Memory开启和效果
全球关注:谈谈 Vue toRef 和 reactive
天天报道:博主带卷尺吃披萨发现尺寸不够:99元12寸披萨直径少2.5厘米
女子称点外卖备注送上楼被骑手教育:四块钱还想让送上楼
三亚骂游客导游被吊销导游证罚款5万:网友点赞 低价团慎重参与
重庆东站一项目招标条件被指“量身定做”:招标人答疑,公管局正处理投诉
mysql 索引(InnoDB)
环球关注:快速带你入门css
世界热门:Git常用命令总结
环球热门:马龙樊振东会师决赛:国乒包揽大满贯5冠
当前热议!俞敏洪谈野生虾事件:犯了错误 就要去改正
世界最资讯丨情侣称住41层酒店被“玻璃人”看光引热议:网友支持酒店已提示
热文:数据安全始终是一个不可忽视的问题
世界最资讯丨数据结构-绪论
全球讯息:职工医保报销比例2022_职工医保报销比例
全球观点:OpenAI CEO谈GPT4:人类迄今开发的最伟大技术 有点害怕了
即时:曹曦月方否认带货3个月成交278元:拿证据说话
希尔排序、快速排序、KMP算法
环球热推荐:008爬虫之短短20行代码下载周杰伦所有歌曲
一次 Hyperf 注解失效问题分析
全球看热讯:Qt+百度AI文字识别OCR小工具
国内外多名大胃王意外死亡 有人胖到320斤有人开播前突然昏迷:专家科普
热点在线丨2023省选16天
著名的Breach黑客论坛管理员被捕
环球微头条丨男子整形后称没法靠颜值吃饭了:丢了工作
《暗黑4》公测性能实测:RTX 4090显卡流畅跑8K
世界短讯!SSL/TLS协议运行机制的概述
最新资讯:重学c#系列—— explicit、implicit与operator[三十四]
世界要闻:李彦宏谈文心一言:市场反馈符合预期 股价波动没必要解释
焦点滚动:挺能藏啊!男子电动滑板车藏84个SSD入境被海关查获
【天天快播报】webpack原理(2):ES6 module在Webpack中如何Tree-shaking构建
CTF show 信息收集篇
Quicker 快速开发,控制脚本关闭(示例,鼠标连点器)
天天微头条丨卡佩罗:那不勒斯和国米将晋级 迈尼昂和奥纳纳是米兰双雄的关键
每日观点:曹姓明星收20万带货3月成交278元 被判退还13.9万:要量力而行
13代酷睿躺赢了 4nm锐龙7000跳票:此前规格被砍2刀
已知球面经纬度求方位角和反方位角(awk一行代码实现)
环球观热点:《流浪地球2》门框机器人科幻十足 设计师详解:还能晾衣服能甩干
东北首条海下/跨海地铁!大连地铁5号线正式运营
世界热讯:Linux学习笔记
报道:插件化架构设计(2):插件化从设计到实践该考量的问题汇总
【天天新要闻】Vins 前端中高效的去畸变的方式解析
动态焦点:暴雪:《暗黑》系列能成功多亏了韩国玩家热情和爱戴
全球观点:朱雀二号遥一运载火箭发射失利:已查明飞行故障 通过归零评审
全球热头条丨《雷霆沙赞2》豆瓣开分6.5:加朵女神加分、剧情被批幼稚低级
【全球独家】万字血书Vue—Vue的核心概念
张兰被曝国外欠债9.8亿,海外家庭信托被追债,拼命带货疑为还债
Ocelot使用与设置路由Routing
环球速递!arthas排查线上问题真是太好用了!
肯德基全家桶被曝吃出生的炸鸡!店家回应是锅出现故障
世界快播:C++ class struct
环球视点!Windows OpenGL ES 图像 GPUImageLookupFilter
世界观速讯丨8万元会成爆款吗?宝骏悦也实车曝光:像吉姆尼、能跑303公里
每日热文:印度男子因新娘高三成绩不好要求退婚 还要退5千彩礼:网友看笑
世界观焦点:CSS学习笔记
热门看点:女生被拍同学勇敢对峙让男子删除 想保护好自己的朋友:网友称赞勇敢
1.5mm!iPhone 15 Pro Max将打破最薄边框纪录:CAD外观渲染图曝光 更帅了
全球微头条丨没有科技与狠活 :依能天然苏打水2.3元发车 无糖无气0卡
03月18日09时福建漳州疫情数据 阳了以后为什么会腰疼?应该怎么办?
当前要闻:为什么文件删除了但磁盘空间没有释放?
微博图床被废,自己动手丰衣足食。
【聚看点】Source Generator初探
4、AOP
天天亮点!汽车降价潮蔓延!成都豪撒1亿购车补贴 汽车流通协会称武汉汽车降价不公平
【天天热闻】俞敏洪称下辈子宁愿当没钱的流浪汉:自己周围的企业家都在没日没夜的干活
比亚迪出海再下一城!乌兹比克斯坦三车齐发:宋PLUS 22万起售
世界聚焦:调查显示民众预期英国央行将继续加息
【全球速看料】差距有多大?一图看懂蔚来、小鹏、理想汽车2022年第四季度财报:老大变了
每日速读!水晶球档杆绝无仅有!韩系豪华电动车捷尼赛思GV60上市:28.58万起
世界速讯:你对Linux窗口管理程序Tmux了解吗
【全球聚看点】还买什么汉兰达!全新大七座SUV福特锐界L开售:22.98万历史新低
【世界速看料】超市6500元招聘引学生排队投简历 负责人:已收到五十多份
世界看点:南宁市2023年事业单位统一考试简章发布 337个岗位共招1764人
【当前独家】读Java性能权威指南(第2版)笔记20_垃圾回收G
何小鹏:王凤英一周工作七天、让大家很卷
何小鹏谈竞争对手降价:油车一定会反击、小鹏将降低25%生产成本
springboot跨域问题解决方案
天天亮点!听闻索尼PS5 Pro主机明年发售后:老玩家们集体不干了
环球通讯!日本女大胃王菅原初代患肠癌病逝:曾10分钟吞399碗荞麦面
全球热点评!美国一核电站承认150万升核污染水泄漏:已隐瞒数月
导演郭帆都看不下去!众筹1亿的《流浪地球2》周边 为啥要偷工减料?
说句话就能做表格、PPT!微软把GPT-4塞进办公套件 我慌了
每日热门:喉结左侧有个硬疙瘩_左侧睾丸里有个小疙瘩是什么
AIGC的下一站是什么?
速读:vue2前端导出带背景色表格 xlsx xlsx-style
环球新资讯:Attention与SelfAttention
五角大楼官员表示:太阳系中可能存在外星母舰探测地球
环球消息!每日机构分析:3月17日
fiddler:The system proxy was changed.Click to reenable capturing
iPhone 15 Pro Max屏幕边框窄爆:将打破小米13纪录