0

0

C# 动态类型dynamic使用方法 C# dynamic关键字有什么用

星降

星降

发布时间:2026-02-03 08:53:02

|

928人浏览过

|

来源于php中文网

原创

dynamic是编译器放弃类型检查的明确信号,var为编译期推导且类型固定,object需显式转换;dynamic适用于COM交互、动态JSON、反射封装及脚本桥接,禁用于业务模型与高频循环。

c# 动态类型dynamic使用方法 c# dynamic关键字有什么用

dynamic 和 var、object 到底差在哪?

dynamic 不是“更灵活的 var”,也不是“带智能提示的 object”——它是编译器主动放弃类型检查的明确信号。

  • var 是编译期推导,类型一旦确定就不可变(var x = "a"; x = 123; 直接编译报错);
  • object 要访问成员必须显式转换(((string)obj).Length),IDE 能提示、能重构;
  • dynamic 所有成员访问、方法调用、运算符都跳过编译检查,全靠运行时 DLR 解析,写错 obj.Lengh(拼错)也能过编译,直到执行才抛 RuntimeBinderException

什么场景真该用 dynamic?

它不是语法糖,而是为特定互操作瓶颈设计的“减压阀”。

  • ✅ 和 COM 对象交互:比如 Excel.Application,不用写一长串 Marshal.ReleaseComObjectInvokeMember
  • ✅ 处理未知结构 JSON:用 Newtonsoft.Json.Linq.JObjectSystem.Text.Json.JsonNode 反序列化后,直接 data.users[0].name 访问;
  • ✅ 包装反射调用:比如你有一堆 MethodInfo 调用逻辑,换成 dynamic obj = target; obj.DoSomething(); 更直白;
  • ✅ 构建脚本桥接层(如暴露 C# 方法给 Lua/Python 调用),配合 IDynamicMetaObjectProvider 实现自定义绑定。

❌ 别用在业务模型层、DTO 传输、循环内高频访问——性能损耗明显(DLR 缓存虽有,但首次解析开销大),且 IDE 完全失能。

怎么安全地用 dynamic?避免 runtime 崩溃

动态不等于随意,几个实操习惯能大幅降低风险:

Glarity
Glarity

Glarity是一款免费开源的AI浏览器扩展,提供YouTube视频总结、网页摘要、写作工具等功能,支持免费的镜像翻译,电子邮件写作辅助,AI问答等功能。

下载
  • 永远在调用前用 obj is stringobj?.GetType() == typeof(int) 做类型守门;
  • 对来自外部的数据(如 API JSON),优先用强类型反序列化;仅当 schema 真正多变、且字段数少时,才退到 dynamic
  • 配合 ExpandoObject 构建可写动态对象时,注意 ExpandoObject 本身实现了 IDictionary,可遍历属性名,方便做字段校验;
  • 在调试时,直接在监视窗口输入 obj.GetType()((IDynamicMetaObjectProvider)obj).GetMetaObject(Expression.Constant(obj)) 查看当前绑定状态。

性能到底慢多少?要不要担心?

DLR 的首次调用比静态调用慢 5–10 倍(主要花在元数据查找和缓存构建上),后续同签名调用会命中缓存,差距缩小到 1.2–1.5 倍。

  • 单次调用(如初始化 Excel、解析一个配置项)完全可忽略;
  • 但在 for 循环里反复调用 item.Name(其中 itemdynamic)就会明显拖慢;
  • 替代方案:用 Convert.ToString(item.Name) 或提前转成具体类型(string name = item.Name;),让后续访问回归静态路径。

真正容易被忽略的是调试成本——断点停住后,你没法靠鼠标悬停看属性,得手动敲 obj.GetType()obj.ToString(),甚至进“快速监视”查 IDynamicMetaObjectProvider 实现细节。这不是语法问题,是开发流被打断。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

425

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

537

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

523

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

233

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

107

2025.10.17

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 15.2万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号