我有一个类,其中包含一些通用属性以及一些其他类型的属性:
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# 是一种静态类型语言。使用反射来构建列表会失去很多好处。
相反,因为几乎可以肯定知道存在什么
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;
}
}
}