在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,但如果我然后添加嵌套对象的另一个列表,我也必须重写那部分。更一般的做法是什么?

谢谢。

在c#中循环遍历嵌套的对象列表以查找属性

使用反射或编写包含该属性的接口

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