C#如何修改RecordFactoryNew方法输出无Key/Value包装的dynamic对象
问题原因
原有代码的三个问题导致输出不符合预期:
- 行遍历逻辑中创建了
List<KeyValuePair>类型的中间集合,而非单个动态对象,导致返回结构嵌套了键值对层 ExpandoObject实例声明在循环外,会被所有行复用,最终所有行的属性都会被最后一行数据覆盖SetDateTimeKindUtc方法调用后没有接收返回值,处理逻辑未生效
修改后的代码
public static List<dynamic> RecordFactoryNew(IEnumerable<Property> columns, DataRowCollection dr) { List<dynamic> output = new List<dynamic>(); for (int i = 0; i < dr.Count; i++) { // 每行生成一个独立的动态对象,利用ExpandoObject实现的IDictionary接口赋值 IDictionary<string, dynamic> rowData = new ExpandoObject(); foreach (var col in columns) { // 接收时间处理后的返回值,若你的SetDateTimeKindUtc参数规则不同可自行调整 var value = SetDateTimeKindUtc(columns, dr[i][col.Name]); rowData[col.Name] = value == DBNull.Value ? null : value; } output.Add(rowData); } return output; }
适配说明
- 返回类型保持
List<dynamic>不变,适配列名、数据类型不固定的场景 - 最终每个集合元素都是扁平结构的动态对象,可直接通过
obj.Links、obj.ReportID的方式访问属性,序列化后就是你需要的{ Links: 'Test.com', ReportID: 21 }结构 - 新增了DBNull的兼容处理,避免数据库空值抛出异常
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

