You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
        }
    }
}

关键修改说明

  1. 获取集合实例:通过property.GetValue(this)获取当前ViewModel对象中该属性的实际值,this代表当前DailyFoodListViewModel实例。
  2. 类型转换与空值处理:用as ObservableCollection<SelectFood>做安全类型转换,同时自动处理空值;添加空值判断避免集合未初始化导致的异常。
  3. 保留/移除break:原代码的break会仅处理第一个符合条件的属性(比如只处理Breakfasts),如果需要同时处理Lunches,删除该break即可。
  4. 简化字符串拼接:用C#字符串插值$"{...}"替代原有的+和string.Format,代码更简洁易读。

内容的提问来源于stack exchange,提问作者Khosro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:09:58