2010-09-14 49 views
1

我对我的大部分对象都有IsDirty类型的属性bool递归地设置同名的所有属性

我的基本对象称为Client,但包含几个里面的收藏如:Client.Portfolios.Policies.Covers.CoverOptions,每个对象类型都有一个IsDirty属性:

  • Client.IsDirty
  • Client.Portfolios.IsDirty
  • Client.Portfolios.Policies.IsDirty
  • 等..

如何递归设置所有IsDirty属性?

回答

4

如果你想它真正的递归,我建议创建一个围绕这一理念设计的界面。例如:

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

除非它们都共享定义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;