2010-10-06 69 views
4

我有一個屬性,像這樣:我如何確保其他依賴它的財產的價值?

private Decimal _payout; 
public Decimal PayoutValue 
    { 
     get { return _payout; } 
     set 
     { 
      _payout = value; 

      //second part of following conditional is an enum 
      if (Math.Abs(value) > 1 && this.PayoutType == CutType.Percent) 
      { 
       _payout /= 100; 
      } 
     } 
    } 

正如你所看到的,它是依賴於的PayoutType價值,這僅僅是一個簡單的枚舉屬性:

public CutType PayoutType { get; set; } 

我的問題是PayoutType在設置PayoutValue之前似乎沒有設置,所以下面的條件永遠不會是真的。在評估PayoutValue之前,我如何強制設置PayoutType

謝謝。

UPDATE感謝您的回答傢伙。我想我應該提到,大多數時候這個對象通過DataContexts或從我的客戶端(MVC項目)的Http.Post綁定,所以我沒有任何構造函數。有沒有其他方法,或者我應該開始通過編程獲得創意?

回答

1

這個怎麼樣?

get 
{ 
    if (Math.Abs(value) > 1 && this.PayoutType == CutType.Percent) 
    { 
     return _payout /100; 
    } 
    return _payout; 
} 
set{_payout = value;} 

因此,您不要更改設置的值。

+0

謝謝。這解決了我的問題! – Jason 2010-10-06 17:59:16

2

如何在評估PayoutValue之前強制設置PayoutType?

把它放在構造函數中。這是執行此規則的唯一方法。

這就是說,我會建議不要這樣做,至少在上面的實現中。用戶目前的財產執行會非常混亂。人們傾向於期望設置一個財產,然後立即提取它將提供相同的價值。

在你的情況下,雖然:

decimal value = 45.3; 
myObject.PayoutValue = value; // Set this 

if (myObject.PayoutValue != value) 
{ 
    // This would normally be a very unexpected case! In your example, it will always be true! 
} 

這將是更好的潛在使用兩個屬性或方法(即:SetPayoutValue(decimal value)),以線索用戶到一個事實,即它不是像個簡單屬性。

+0

好的......也許我應該有三個屬性?一個是原始值,一個是計算值? – Jason 2010-10-06 17:40:17

+0

+1爲設計建議。另一種選擇是創建兩個不同的類,因爲它們具有截然不同的語義。 – 2010-10-06 17:40:24

+0

@Jason:可能 - 雖然我同意傑夫的看法,但是兩類可能會更有意義。如果你想要一個類,我會使用方法而不是屬性設置器來設置百分比。它正在做一個計算,它向我建議「方法」,而不是支持setter .. – 2010-10-06 17:43:12

0

所有「必需」屬性應該在您的類的構造函數中。