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

posted on   空明流光  阅读(785)  评论(0编辑  收藏  举报

编辑推荐:
· 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

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示