C#创建编译时动态属性对象和运行时动态属性对象(linq 动态列名)
void Main() { var list = new List<object>(); Enumerable.Range(1, 100).ToList().ForEach(item => { dynamic d = new System.Dynamic.ExpandoObject(); d.Name = "张三"; d.Gender = item % 3 == 0 ? "男" : "女"; (d as IDictionary<string, Object>).Add("Age", 30+item); list.Add(d); }); list.Dump(); }
对于需要临时使用一个类型,却用不想定义一个类。或者前端绑定的动态列名的情况,也非常方便。
结果如下:
经验证,这种数据集可以直接绑定到 WPF,但绑定到 asp.net GridView 和 winform 的 DataGridView 一个报错一个没反应,那就转成DataTable吧,一个扩展方法就搞定了
public static class DynamicExtension { public static DataTable ToDataTable(this IEnumerable<dynamic> items) { var data = items.ToArray(); if (data.Count() == 0) return null; var dt = new DataTable(); foreach (var key in ((IDictionary<string, object>)data[0]).Keys) { dt.Columns.Add(key); } foreach (var d in data) { dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray()); } return dt; } }
dynamic 类型竟然支持序列化与反序列化:
dynamic d = new ExpandoObject(); d.Name = "张三"; d.Gender = "男"; (d as IDictionary<string, Object>).Add("Age", 30); Console.WriteLine( Newtonsoft.Json.JsonConvert.SerializeObject(d)); dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpandoObject>( Newtonsoft.Json.JsonConvert.SerializeObject(d)); Console.WriteLine( x.Name); Console.WriteLine( x.Gender); Console.WriteLine( x.Age);
使用中发现ExpandoObject可以转为dynamic,但dynamic无法转换为ExpandoObject,切记不要相互转换,比如反序列化时选ExpandoObject,而不能选dynamic。
使用时还有一点需要注意,不要给dynamic无法识别的数据类型,如 null
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-04-09 c# 坑人的发邮件组件
2013-04-09 asp.net 自定义控件之ItemTemplate