在c#中循环遍历嵌套的对象列表以查找属性
本文关键字:列表 对象 查找 属性 嵌套 循环 遍历 | 更新日期: 2023-09-27 18:18:37
我有一个这样的对象模型:
public class MyClass
{
int TheProp {get;set;}
List<Object1> TheListOfObject1 {get;set;}
List<Object2> TheListOfObject2 {get;set;}
List<Object3> TheListOfObject3 {get;set;}
List<Object4> TheListOfObject4 {get;set;}
}
现在一些嵌套的对象包含一个名为MyField的属性,有些列表可能有对象,有些没有。
我正在寻找遍历每个列表,如果列表中的对象包含属性MyField,则将该属性设置为1。
最好的方法是什么?我可以硬编码循环,只循环通过列表,我知道有我正在寻找的属性,然后测试列表是否有一个计数> 0,但如果我然后添加嵌套对象的另一个列表,我也必须重写那部分。更一般的做法是什么?
谢谢。
使用反射或编写包含该属性的接口
public interface IProperty {
int Prop { get; set; }
}
并在所有具有该属性的类中实现它。然后可以使用
foreach (var obj in myList.OfType<IProperty>()) {
obj.Prop = 1;
}
问题是:你真的需要不同的列表吗?让我们假设您的ObjectX类都派生自一个公共基类BaseObject。
class BaseClass {
int Prop { get; set; }
// possibly other members here
}
class Object1 : BaseClass {
}
class Object2 : BaseClass {
}
// And so on
那么你可以将所有的对象添加到同一个列表中:
List<BaseClass> list = new List<BaseClass>();
list.Add(new Object1());
list.Add(new Object2());
或者你可以有一个列表的列表:
List<List<BaseClass>> lists = new List<List<BaseClass>>();
lists.Add(new List<BaseClass>());
lists.Add(new List<BaseClass>());
lists[0].Add(new Object1());
lists[1].Add(new Object2());
使用嵌套循环,你可以一次访问所有的对象:
foreach (List<BaseClass> lst in lists) {
foreach (BaseClass obj in lst) {
if (obj != null) {
obj.Prop = 1;
}
}
}