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

dynamic 是 C# 中用于绕过编译时类型检查的特殊类型,它把类型解析推迟到运行时。用它不是为了“替代”静态类型,而是为了解决某些特定场景下类型不确定、互操作复杂或代码过于冗长的问题。
什么时候该用 dynamic?
常见适用场景包括:
与 COM 对象交互(比如 Excel、Word 自动化)调用反射结果时避免写一堆 InvokeMember 或 GetProperty处理 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)处理。
和 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 做动态对象
想在运行时自由增删属性?ExpandoObject 是 dynamic 的好搭档:
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 不复杂但容易忽略它的代价:可读性下降、调试变难、错误延后。只在真有必要时用,别把它当“万能类型”。
以上就是C#如何使用dynamic关键字 C#动态类型dynamic用法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442963.html
微信扫一扫
支付宝扫一扫