如何使用反射在 C# 中创建 List<T> 实例

问题描述 投票:0回答:1

我有一个类,其中包含一些通用属性以及一些其他类型的属性:

 private ObservableCollection<SelectFood> _breakfasts = new ObservableCollection<SelectFood>();

 public ObservableCollection<SelectFood> Breakfasts
 {
     get { return _breakfasts; }
     set { SetProperty(ref _breakfasts, value); }
 }

 private ObservableCollection<SelectFood> _lunches = new ObservableCollection<SelectFood>();
 public ObservableCollection<SelectFood> Lunches
 {
     get { return _lunches; }
     set
     { SetProperty(ref _lunches, value); }
 }

 private TblDailyFoodList _foodinfo = new TblDailyFoodList();
 public TblDailyFoodList Foodinfo
 {
     get { return _foodinfo; }
     set { SetProperty(ref _foodinfo, value); }
 }

SelectFood
是一个
userControl
,带有一些 Field、属性和 ...

现在,在方法中我想迭代此类的属性,如果属性的类型为

ObservableCollection<SelectFood>
,根据它的名称,做一些工作:

private void SelectedFoods()
{
    PropertyInfo[] properties = typeof(DailyFoodListViewModel).GetProperties();

    foreach (PropertyInfo property in properties)
    {
        if (property.PropertyType == typeof(ObservableCollection<SelectFood>))
        {
            foreach (var item in property)
            {
                if (item.IsChkbxChecked == true)
                {
                    Foodinfo.Foods += item.MyTblFoodInfo.FoodType + string.Format(item.MyTblFoodInfo.Id.ToString("000"));
                }
            }
            break;
        }
    }
}

现在我的问题是: 在

foreach (var item in property)
循环中,我不能直接使用
property
。 如何在 foreach 循环中使用
property

c# generics iteration
1个回答
0
投票

C# 是一种静态类型语言。使用反射来构建列表会失去很多好处。

相反,因为几乎可以肯定知道存在什么

ObservableCollections
,所以你可能应该这样做:

var list = new List<SelectFood>();

list.Concat(Breakfasts);
list.Concat(Lunches);
//... for each meal

return result;

如果你绝对必须使用反射,你需要调用

property.GetValue
,像这样:


private void SelectedFoods()
{
    PropertyInfo[] properties = typeof(DailyFoodListViewModel).GetProperties();

    foreach (PropertyInfo property in properties)
    {
        if (property.PropertyType == typeof(ObservableCollection<SelectFood>))
        {
            foreach (var item in (ObservableCollection<SelectFood>)property.GetValue(this))
            {
                if (item.IsChkbxChecked == true)
                {
                    Foodinfo.Foods += item.MyTblFoodInfo.FoodType + string.Format(item.MyTblFoodInfo.Id.ToString("000"));
                }
            }
            break;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.