我有一个像这样的对象模型:
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但是如果我再添加另一个嵌套对象列表,我也必须重写该部分。有什么更通用的方法呢?
感谢。
答案 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;
}
}
}