C#:如何向已存入List的匿名对象添加新属性Start?
解决方案:给DataList对象动态添加属性
你的核心问题是匿名类型的属性是只读的,没法在创建后再添加或修改属性。下面提供几种可行的实现方式,按推荐程度排序:
1. 定义实体类(最推荐,类型安全)
直接创建一个包含所有需要属性的类,既能修改属性值,又能保证类型安全,方便后续维护。
// 先定义对应的数据实体类 public class DataItem { public object Value { get; set; } public DateTime Time { get; set; } // 根据实际类型调整,比如string/long等 public object Start { get; set; } } // 修改原有代码逻辑 public List<DataItem> DataList = new List<DataItem>(); if(somecondition) { var newItem = new DataItem { Value = Value, Time = time }; DataList.Add(newItem); } if(somecondition) { // 确保列表中有元素再赋值 if (DataList.Count > 0) { DataList[0].Start = start; } }
后续使用时,直接通过DataList[0].Value/Time/Start访问即可,没有类型转换问题。
2. 使用ExpandoObject(动态类型,快速原型)
如果不想提前定义类,可以用ExpandoObject实现动态属性添加,代价是失去编译时类型检查,适合临时场景。
public List<dynamic> DataList = new List<dynamic>(); if(somecondition) { dynamic newItem = new ExpandoObject(); newItem.Value = Value; newItem.Time = time; DataList.Add(newItem); } if(somecondition) { if (DataList.Count > 0) { DataList[0].Start = start; } }
注意:使用dynamic类型时,属性名称拼写错误只会在运行时抛出异常,需要额外注意。
3. 提前合并条件,一次性创建对象
如果两个条件的判断可以提前完成,直接根据条件组合创建对应的匿名类型对象,避免后续修改。
public List<object> DataList = new List<object>(); bool needValueAndTime = somecondition; bool needStart = somecondition; if (needValueAndTime) { if (needStart) { DataList.Add(new { Value = Value, Time = time, Start = start }); } else { DataList.Add(new { Value = Value, Time = time }); } }
这种方式适合条件判断顺序不影响逻辑的场景,代码更简洁,但灵活性稍差。
内容的提问来源于stack exchange,提问作者st27
相关产品推荐
相关产品推荐

