Skip to Content
MUZINET-NOTE 4.0 is released 🎉
技术知识库C#动态类型-dynamic

⚡ C# 中的 dynamic 动态类型注意事项

在 C# 中,dynamic 是一种特殊类型,它让编译器在运行时而不是编译时决定对象的类型。
这使得代码更灵活,但同时也带来了潜在的类型安全风险。


🧩 一、示例代码

以下示例展示了在使用 dynamic 时,
如何将 JSON 动态对象转化为 List<dynamic>

public string SendPacketService(dynamic postdata) { // 将 dynamic 类型的 list 转为 List<dynamic> List<dynamic> list = postdata.list.ToObject<List<dynamic>>(); // 例如:打印每个元素 foreach (var item in list) { Console.WriteLine(item); } return "ok"; }

🧠 二、关键点说明

项目说明
dynamic 是运行时绑定类型编译器不会在编译阶段验证类型,所有成员调用在运行时决定。
易导致运行时异常postdata.list 不存在或类型错误,会在运行时抛出异常。
object 的区别object 需要显式转换(compile-time check),dynamic 自动延迟到运行时。
可配合 JSON 反序列化使用常用于 Newtonsoft.JsonJObjectJArray

⚙️ 三、示例:动态 JSON 处理

假设你收到的 postdata 是一个 JSON 对象:

{ "list": [ { "id": 1, "name": "Alice" }, { "id": 2, "name": "Bob" } ] }

在 C# 中处理方式如下:

using Newtonsoft.Json.Linq; public void Process(dynamic postdata) { List<dynamic> list = postdata.list.ToObject<List<dynamic>>(); foreach (var item in list) { Console.WriteLine($"ID: {item.id}, Name: {item.name}"); } }

输出:

ID: 1, Name: Alice ID: 2, Name: Bob

⚠️ 四、使用 dynamic 时的注意事项

注意点说明
🚫 编译器不会提示错误若属性拼写错误(如 postdata.lits),不会在编译时报错。
⚠️ 性能较低由于运行时绑定,会增加反射调用开销。
🧩 建议仅用于不确定结构的数据如 JSON、外部接口返回值等。
可用 JObject 或强类型类代替在结构固定时,尽量避免使用 dynamic。

💡 五、与 var 的区别

关键字绑定时机类型检查是否安全典型场景
var编译时(compile-time)✅ 编译时检查✅ 安全局部推断类型
dynamic运行时(runtime)❌ 不检查⚠️ 需谨慎动态 JSON、脚本交互

示例对比:

var user = new { Name = "Alice" }; // 编译期已知类型 dynamic user2 = new { Name = "Bob" }; // 运行时才检查成员

🧱 六、最佳实践建议

✅ 推荐:

var jObject = JObject.Parse(json); List<MyModel> list = jObject["list"].ToObject<List<MyModel>>();

⚠️ 谨慎使用:

List<dynamic> list = postdata.list.ToObject<List<dynamic>>();

🚀 小结:

只有当数据结构不确定、类型需要动态适配时,才应使用 dynamic。 否则建议使用 强类型模型(Strongly Typed Model) 提高安全性与可维护性。


✅ 七、总结

要点建议
使用场景JSON、脚本交互、反射、COM 对象等
风险无编译时检查、性能下降、调试困难
替代方案var + 强类型类 或 JObject
转换方法ToObject<List<T>>() 是常用且安全的方式

💬 结论:

dynamic 提供了灵活性,但也牺牲了类型安全和性能。 在处理动态 JSON 时,它非常方便,但在正式项目中应谨慎使用,并在关键逻辑中保持强类型约束。