新闻中心

C#如何使用dynamic关键字 C#动态类型dynamic用法

2025-12-13
浏览次数:
返回列表
dynamic是C#中将类型检查推迟到运行时的特殊类型,适用于COM交互、反射调用、动态JSON处理及DSL构建等场景,但会丢失编译检查与IDE支持。

c#如何使用dynamic关键字 c#动态类型dynamic用法

dynamic 是 C# 中用于绕过编译时类型检查的特殊类型,它把类型解析推迟到运行时。用它不是为了“替代”静态类型,而是为了解决某些特定场景下类型不确定、互操作复杂或代码过于冗长的问题。

什么时候该用 dynamic?

常见适用场景包括:

  • 与 COM 对象交互(比如 Excel、Word 自动化)
  • 调用反射结果时避免写一堆 InvokeMemberGetProperty
  • 处理 JSON 或其他动态结构(配合 ExpandoObject 或第三方库如 Newtonsoft.Json 的 JObject
  • 构建高度泛化的 DSL 或脚本桥接层

⚠️ 注意:它不等于“任意类型”,也不提升性能——反而会丢失编译器检查、IDE 智能提示和重构支持,容易在运行时报错。

basic 用法:声明和赋值

声明一个 dynamic 变量,可以赋任何值,后续调用成员时不会在编译时报错:

dynamic obj = "hello";
obj.Length; // ✅ 编译通过,运行时调用 string.Length  
obj.ToUpper(); // ✅  
<p>obj = 123;
obj.ToString(); // ✅ 运行时调用 int.ToString()<br />
obj.Length; // ❌ 运行时报错:'int' 不包含 'Length'

编译器不验证成员是否存在,一切交给运行时的 DLR(Dynamic Language Runtime)处理。

DeepBrain DeepBrain

AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!

DeepBrain 146 查看详情 DeepBrain

和 var、object 的关键区别

var 是隐式类型推导,仍是静态类型(只是不写出来),编译后不可变;object 是所有类型的基类,访问成员必须显式转换;dynamic 则彻底跳过编译期绑定:

var s = "abc";     // s 是 string 类型,s.Length ✅,s.ToUpper() ✅  
object o = "abc";  // o 是 object,o.Length ❌(需 (string)o.Length)  
dynamic d = &quot;abc"; // d.Length ✅,d.ToUpper() ✅,无需转换

配合 ExpandoObject 做动态对象

想在运行时自由增删属性?ExpandoObjectdynamic 的好搭档:

dynamic person = new ExpandoObject();
person.Name = "张三";
person.Age = 28;
person.SayHi = (Func<string>)(() => $"Hi, I'm {person.Name}");
<p>Console.WriteLine(person.Name); // 张三<br />
Console.WriteLine(person.SayHi()); // Hi, I'm 张三

注意:赋值给 SayHi 的是 lambda,类型是 Func<string></string>,所以调用时加括号即可——DLR 会按实际类型执行。

基本上就这些。dynamic 不复杂但容易忽略它的代价:可读性下降、调试变难、错误延后。只在真有必要时用,别把它当“万能类型”。

以上就是C#如何使用dynamic关键字 C#动态类型dynamic用法的详细内容,更多请关注其它相关文章!


# excel  # word  # 查询结果  # 重构  # 如何使用  # asic  # json处理  # c#  # 区别  # json  # js  # 荣昌知名网站建设公司  # 淘宝推广直播营销  # 广东创新网站推广多少钱  # 郁南全网营销型网站建设  # 铁岭网站网址优化工具  # 泰州新网站如何优化推广  # 莱阳响应式网站优化公司  # 自己网站怎么建设推广  # 湖北专业抖音seo厂家  # 电商网站建设开发哪家好  # 你可以  # 导出到  # 也不  # 不依赖  # 推迟到  # 的是  # 如何处理 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  微信语音通话掉线如何解决 微信语音通话稳定优化方法  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  Kafka Streams中基于消息头条件过滤消息的实现指南  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  理解Python模块与全局变量的作用域管理  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  HTML长属性值处理:表单action路径优化与代码规范应对  将HTML Canvas内容转换为可上传的图像文件(File对象)  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  J*aScript打印功能_j*ascript输出控制  c++如何使用chrono库处理时间_c++标准库时间与日期操作  jQuery Mask 插件中实现电话号码固定前导零的教程  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  蛙漫安全无毒 官方认证的绿色入口  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  深入理解Promise链:如何在catch后中断then的执行  曝R星经典之作开发图 设计简陋但信息密集!  深入理解与实现最大堆的Heapify过程:常见错误与修正  J*aScript map 迭代中检测空数组元素的有效方法  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  海量存储:机器视觉智能化的核心基石  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  CSS Box Model与弹性按钮:维持布局稳定的动画实践  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  必由学官方登录入口 必由学教师学生账号快速访问  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达 

搜索