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

时间:2011-12-21 23:03:46

标签: c#

我有一个像这样的对象模型:

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.

最好的方法是什么?我可以对循环进行硬编码,只循环遍历列表,我知道那里有我正在寻找的属性,然后测试列表是否有计数&gt; 0但是如果我再添加另一个嵌套对象列表,我也必须重写该部分。有什么更通用的方法呢?

感谢。

2 个答案:

答案 0 :(得分:4)

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

public interface IProperty {
    int Prop { get; set; }
}

并在具有该属性的所有类中实现它。然后你可以使用

foreach (var obj in myList.OfType<IProperty>()) {
    obj.Prop = 1;
}

答案 1 :(得分: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;
        }
    }
}