C#反射中如何遍历ObservableCollection<SelectFood>类型属性的元素
解决遍历泛型集合属性的问题
你遇到的核心问题是:property是属性的元数据对象(PropertyInfo),并非属性对应的实际集合实例,因此无法直接用foreach遍历。需要先获取当前ViewModel实例中该属性的实际值,转换为对应集合类型后再进行遍历操作。
修正后的完整代码如下:
private void SelectedFoods() { PropertyInfo[] properties = typeof(DailyFoodListViewModel).GetProperties(); foreach (PropertyInfo property in properties) { // 判断属性类型是否为目标泛型集合 if (property.PropertyType == typeof(ObservableCollection<SelectFood>)) { // 获取当前实例中该属性的实际集合对象 var foodCollection = property.GetValue(this) as ObservableCollection<SelectFood>; // 空值判断,避免空引用异常 if (foodCollection != null) { foreach (var item in foodCollection) { if (item.IsChkbxChecked) { // 简化字符串拼接逻辑 Foodinfo.Foods += $"{item.MyTblFoodInfo.FoodType}{item.MyTblFoodInfo.Id.ToString("000")}"; } } } // 若需要同时处理Breakfasts和Lunches所有符合条件的属性,请删除下面的break // break; } } }
关键修改说明
- 获取集合实例:通过
property.GetValue(this)获取当前ViewModel对象中该属性的实际值,this代表当前DailyFoodListViewModel实例。 - 类型转换与空值处理:用
as ObservableCollection<SelectFood>做安全类型转换,同时自动处理空值;添加空值判断避免集合未初始化导致的异常。 - 保留/移除break:原代码的
break会仅处理第一个符合条件的属性(比如只处理Breakfasts),如果需要同时处理Lunches,删除该break即可。 - 简化字符串拼接:用C#字符串插值
$"{...}"替代原有的+和string.Format,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Khosro
相关产品推荐
相关产品推荐

