使父对象中的属性对其任何包含的对象可见

时间:2013-11-20 17:45:13

标签: c#-4.0 scope parent-child

我有一个CalculationManager类,它由BackgroundWorker实例化,因此具有CancellationRequested属性。

CalculationManager有一个Execute()方法,它使用自己的Calculation方法实例化一些不同的Execute()私有类,这些方法可能会或可能不会实例化某些SubCalculation私有类,以“工作分解结构”的方式,每个子类实现顺序计算的一部分。

如果设置了一些“全局”Execute(),我需要做的是让每个类在CancellationRequested方法的循环中(彼此不同)进行检查为真。我将“全局”放在引号中,因为此属性将位于最顶层CalculationManager类的范围内。

所以,问题是:

  

如何在类中为每个(可能是嵌套的)子类创建一个属性?

或放下另一种方式:

  

如何在其父层次结构的“根对象”中检查属性? (嗯,不完全,因为CalculationManager也会有父母,但你有了一般的想法。

我想使用某种AttachedProperty,但这些类是类库中的域对象,与WPF或XAML等无关。

1 个答案:

答案 0 :(得分:1)

这样的东西?

public interface IInjectable {
  ICancelStatus Status { get; }
}
public interface ICancelStatus {
  bool CancellationRequested { get; }
}
public class CalculationManager {
  private IInjectable _injectable;
  private SubCalculation _sub;
  public CalculationManager(IInjectable injectable) {
    _injectable = injectable;
    _sub = new SubCalculation(injectable);
  }
  public void Execute() {}
}
public class SubCalculation {
  private IInjectable _injectable;
  public SubCalculation(IInjectable injectable) {
    _injectable = injectable;
  }
}
private class CancelStatus : ICancelStatus {
  public bool CancellationRequested { get; set;}
}

var status = new CancelStatus();
var manager = new CalculationManager(status);
manager.Execute();

// once you set status.CancellationRequested it will be immediatly visible to all
// classes into which you've injected the IInjectable instance