0

0

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

星降

星降

发布时间:2025-12-13 17:41:30

|

396人浏览过

|

来源于php中文网

原创

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(); // ✅  

obj = 123; obj.ToString(); // ✅ 运行时调用 int.ToString()
obj.Length; // ❌ 运行时报错:'int' 不包含 'Length'

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

喜鹊标书
喜鹊标书

AI智能标书制作平台,10分钟智能生成20万字投标方案,大幅提升中标率!

下载

和 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 = "abc"; // d.Length ✅,d.ToUpper() ✅,无需转换

配合 ExpandoObject 做动态对象

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

dynamic person = new ExpandoObject();
person.Name = "张三";
person.Age = 28;
person.SayHi = (Func)(() => $"Hi, I'm {person.Name}");

Console.WriteLine(person.Name); // 张三
Console.WriteLine(person.SayHi()); // Hi, I'm 张三

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

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

相关专题

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

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

412

2023.08.07

json是什么
json是什么

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

533

2023.08.23

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

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

310

2023.10.13

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

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

74

2025.09.10

string转int
string转int

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

318

2023.08.02

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

48

2026.01.05

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

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

共162课时 | 12.3万人学习

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

共28课时 | 2.4万人学习

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

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