2

コンストラクターの難問、私はこれら 2 つのコンストラクターを持っています。1 つはクラスのコピーを作成するためのもので、もう 1 つは標準コンストラクターです。その中でルールを使用できるように、最初のものを呼び出す必要があります。コードを繰り返す必要はないので、2 つの次元を上書きしないようにする方法を探しています。

public SprinklerLineModel()
    {

        NearCrossMainDimension = new PipeDimensionModel();
        FarCrossMainDimension = new PipeDimensionModel();

        this.AddValidationRule(Rule.CreateRule(() => BranchLineDiameter, RuleMessage.GREATER_THAN_ZERO, () => BranchLineDiameter > 0));
    }

    /// <summary>
    /// Copy Constructor
    /// </summary>
    /// <param name="sprinklerLineModel">Original copy of sprinklerLineModel</param>
    public SprinklerLineModel(SprinklerLineModel sprinklerLineModel)
        :this()
    {
        this.EstimatedFlow = sprinklerLineModel.EstimatedFlow;
        this.EstimatedPressure = sprinklerLineModel.EstimatedPressure;
        this.NearCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.NearCrossMainDimension);
        this.FarCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.FarCrossMainDimension);
        this.BranchLineDiameter = sprinklerLineModel.BranchLineDiameter;
        this.LeadLinePipeFittingLength = sprinklerLineModel.LeadLinePipeFittingLength;
        this.ExbPipeFittingLength = sprinklerLineModel.ExbPipeFittingLength;

        this.IsDirty = sprinklerLineModel.IsDirty;
    }

2 つの変数を上書きせずに、デフォルトのコンストラクターを呼び出せるようにしたいと考えています。どんな助けでも大歓迎です。

それらがnullかどうかを確認して確認できると思いますが、それが最善の方法ではないようです。

ありがとう

4

2 に答える 2

0

私はこのようなことをします:

public SprinklerLineModel()
    : this(null)
{
}

/// <summary> 
/// Copy Constructor 
/// </summary> 
/// <param name="sprinklerLineModel">Original copy of sprinklerLineModel</param> 
public SprinklerLineModel(SprinklerLineModel sprinklerLineModel)
{
    this.EstimatedFlow = sprinklerLineModel.EstimatedFlow;
    this.EstimatedPressure = sprinklerLineModel.EstimatedPressure;
    if (sprinklerLineModel != null)
    {
        this.NearCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.NearCrossMainDimension);
        this.FarCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.FarCrossMainDimension);
    }
    else
    {
        NearCrossMainDimension = new PipeDimensionModel();
        FarCrossMainDimension = new PipeDimensionModel();
    }
    this.BranchLineDiameter = sprinklerLineModel.BranchLineDiameter;
    this.LeadLinePipeFittingLength = sprinklerLineModel.LeadLinePipeFittingLength;
    this.ExbPipeFittingLength = sprinklerLineModel.ExbPipeFittingLength;

    this.IsDirty = sprinklerLineModel.IsDirty;

    this.AddValidationRule(Rule.CreateRule(() => BranchLineDiameter, RuleMessage.GREATER_THAN_ZERO, () => BranchLineDiameter > 0));
}

利点は、1か所に実装できることです。

/ティビ

于 2011-11-20T02:45:06.670 に答える
0

初期化メソッドを抽出し、両方のコンストラクターからそのメソッドを呼び出します。

public SprinklerLineModel()
{
    NearCrossMainDimension = new PipeDimensionModel();
    FarCrossMainDimension = new PipeDimensionModel();
    Init();
}

public SprinklerLineModel(SprinklerLineModel sprinklerLineModel)
{
    this.EstimatedFlow = sprinklerLineModel.EstimatedFlow;
    this.EstimatedPressure = sprinklerLineModel.EstimatedPressure;
    this.NearCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.NearCrossMainDimension);
    this.FarCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.FarCrossMainDimension);
    this.BranchLineDiameter = sprinklerLineModel.BranchLineDiameter;
    this.LeadLinePipeFittingLength = sprinklerLineModel.LeadLinePipeFittingLength;
    this.ExbPipeFittingLength = sprinklerLineModel.ExbPipeFittingLength;
    this.IsDirty = sprinklerLineModel.IsDirty;
    Init();
}

void Init()
{
    this.AddValidationRule(Rule.CreateRule(() => BranchLineDiameter, RuleMessage.GREATER_THAN_ZERO, () => BranchLineDiameter > 0));
}
于 2011-11-20T02:35:25.783 に答える