C# 如何将动态属性数据集转换为可序列化扁平通用模型
核心结论
需求完全可以实现。你之前尝试的匿名类方案不可行是因为匿名类的属性结构是编译时确定的,无法在运行时动态设置属性名,改用.NET内置的ExpandoObject即可实现动态属性的构建,最终序列化后的输出完全符合你要求的格式。
场景1:输入为三字段 List<Model>(Character/Quality/Value)
using System.Dynamic; using System.Linq; using System.Collections.Generic; // 假设ds为你的原始IEnumerable<Model>集合 var result = ds.GroupBy(m => m.Character) .Select(g => { // 用ExpandoObject支持动态添加属性 dynamic characterObj = new ExpandoObject(); characterObj.Character = g.Key; // 转成字典操作,实现动态加属性 var objDict = (IDictionary<string, object>)characterObj; foreach (var qualityItem in g) { // 可根据需要提前判断是否存在重复Quality,避免报错 if (!objDict.ContainsKey(qualityItem.Quality)) { // 如果需要数值类型,可在这里做类型转换,比如int.TryParse处理Strength字段 objDict.Add(qualityItem.Quality, qualityItem.Value); } } return characterObj; }) .ToList();
场景2:输入为拆分后带List<Quality>的List<Model>
代码逻辑更简洁:
using System.Dynamic; using System.Linq; using System.Collections.Generic; // 假设modelList为拆分后的IEnumerable<Model>集合 var result = modelList.Select(m => { dynamic characterObj = new ExpandoObject(); characterObj.Character = m.Character; var objDict = (IDictionary<string, object>)characterObj; foreach (var quality in m.Qualities) { if (!objDict.ContainsKey(quality.Name)) { objDict.Add(quality.Name, quality.Value); } } return characterObj; }) .ToList();
序列化说明
生成的List<dynamic>可以直接用任意JSON序列化组件转换为你需要的格式,以Newtonsoft.Json为例:
string outputJson = JsonConvert.SerializeObject(result, Formatting.Indented);
输出结果和你给出的目标动态对象数组结构完全一致。
内容的提问来源于stack exchange,提问作者jamheadart
相关产品推荐
相关产品推荐

