我对我的大部分对象都有IsDirty
类型的属性bool
。递归地设置同名的所有属性
我的基本对象称为Client
,但包含几个里面的收藏如:Client.Portfolios.Policies.Covers.CoverOptions
,每个对象类型都有一个IsDirty
属性:
Client.IsDirty
Client.Portfolios.IsDirty
Client.Portfolios.Policies.IsDirty
- 等..
如何递归设置所有IsDirty
属性?
我对我的大部分对象都有IsDirty
类型的属性bool
。递归地设置同名的所有属性
我的基本对象称为Client
,但包含几个里面的收藏如:Client.Portfolios.Policies.Covers.CoverOptions
,每个对象类型都有一个IsDirty
属性:
Client.IsDirty
Client.Portfolios.IsDirty
Client.Portfolios.Policies.IsDirty
如何递归设置所有IsDirty
属性?
如果你想它真正的递归,我建议创建一个围绕这一理念设计的界面。例如:
public interface IDirtyObject
{
/// <summary>Gets a value indicating whether this object is dirty.</summary>
bool IsDirty { get; set; } // or perhaps get only?
/// <summary>Sets this object, as well as dirty objects within it, to
/// the specified dirty value.</summary>
void SetAllDirty(bool dirty);
}
然后在每个对象,你会实现这些是这样的:
public class MyDirtyObject : IDirtyObject
{
// (note you can have get and set here even if the interface has only get)
public bool IsDirty { get; set; }
public IDirtyObject MyOtherDirtyObject;
public List<IDirtyObject> MoreDirtyObjects;
public void SetAllDirty(bool dirty)
{
IsDirty = dirty;
if (MyOtherDirtyObject != null)
MyOtherDirtyObject.SetAllDirty(dirty);
if (MoreDirtyObjects != null)
foreach (var obj in MoreDirtyObjects)
obj.SetAllDirty(dirty);
}
}
除非它们都共享定义IsDirty属性的公共基类或接口,否则您需要使用反射或dynamic
(仅限C#4.0)。后者使用起来更容易,可以简化为。
foreach (var obj in myobjects) {
dynamic dynobj = obj;
dynobj.IsDirty = false;
}
尽管如此,如果您有修改对象的能力,您可以为每个对象创建和添加接口。它比动态的好,主要性能和编译时检查
interface IDirtyObject {
bool IsDirty { get; set; }
}
class ExampleDirtyObject : IDirtyObject {
public bool IsDirty { get; set; }
}
foreach (IDirtyObject obj in myobjects)
obj.IsDirty = false;