【问题标题】:looping through nested list of object to find properties in c#循环遍历对象的嵌套列表以在 c# 中查找属性
【发布时间】:2011-12-21 23:03:45
【问题描述】:

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

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,但如果我随后添加另一个嵌套对象列表,我将拥有也重写那部分。更通用的方法是什么?

谢谢。

【问题讨论】:

  • 什么是Object1、Object2、Object3?这些是不同的类别吗?不同类型的列表如何包含特定的属性?
  • @Paul:是的,它们是不同的类。有些包含用户 ID,这就是我希望添加到这些对象中的内容。

标签: c#


【解决方案1】:

要么使用反射,要么编写包含该属性的接口

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

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

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

【讨论】:

  • 这是最好的做法。我写的是一样的:) sehr gut
【解决方案2】:

这里的问题是:你真的需要有不同的列表吗?让我们假设您的 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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-07-08
    • 2013-03-19
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多