C#将Test类列表转换为交替属性动态列表的逻辑错误如何修正
存在的问题
- 动态属性绑定识别问题:你使用
ExpandoObject生成动态对象时,如果后续将testList用于数据绑定(如WinForm/WPF的DataGrid等控件),大部分控件的属性探测逻辑只会读取列表第一个对象的属性作为列架构,后续偶数行的Name1、Name2属性不会被识别,表现为偶数行数据看不到,误以为对象没有被添加到列表中。 - 计数变量无重置风险:
rowIndex变量如果是全局变量或者多次执行该段逻辑时没有重置为初始值1,会导致奇偶判断错误,属性分配不符合预期。
修复方案
方案1:统一动态对象属性结构(适用于1个原始对象对应1行的需求)
提前定义所有可能用到的属性,无值时设为null即可,保证列表所有对象的属性结构一致,绑定控件可以识别全部列:
List<dynamic> testList = new(); // 每次执行前重置索引,避免累计错误 int rowIndex = 1; foreach (var testDt in tests) { dynamic testData = new ExpandoObject(); // 预先声明所有属性 testData.Name = null; testData.Description = null; testData.Number = null; testData.Name1 = null; testData.Name2 = null; if (rowIndex % 2 != 0) { testData.Name = testDt.Name; testData.Description = testDt.Description; testData.Number = testDt.Number; } else { testData.Name1 = testDt.Name1; testData.Name2 = testDt.Name2; } testList.Add(testData); rowIndex++; }
方案2:拆分原始对象为两行(适用于1个原始对象对应两行的需求,符合示例图常见场景)
如果你的需求是每个原始Test对象生成两行交替显示,调整逻辑为每个对象添加两个动态对象:
List<dynamic> testList = new(); foreach (var testDt in tests) { // 奇数行:取Name、Description、Number dynamic oddRow = new ExpandoObject(); oddRow.Name = testDt.Name; oddRow.Description = testDt.Description; oddRow.Number = testDt.Number; oddRow.Name1 = null; oddRow.Name2 = null; testList.Add(oddRow); // 偶数行:取Name1、Name2 dynamic evenRow = new ExpandoObject(); evenRow.Name = null; evenRow.Description = null; evenRow.Number = null; evenRow.Name1 = testDt.Name1; evenRow.Name2 = testDt.Name2; testList.Add(evenRow); }
内容的提问来源于stack exchange,提问作者Glory Raj
相关产品推荐
相关产品推荐

