如何确保依赖于其他人的财产价值?

时间:2010-10-06 17:31:40

标签: c# asp.net-mvc-2 properties getter-setter

我有这样的财产:

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之前没有设置,所以下面的条件永远不会成立。如何在评估PayoutType之前强制设置PayoutValue

感谢。

更新感谢您的回答。我想我应该提到大多数时候这个对象是通过DataContexts绑定的,还是来自客户端(MVC项目)的Http.Post绑定,所以我真的没有任何构造函数。还有其他方法,或者我应该开始对我的编程进行创作吗?

3 个答案:

答案 0 :(得分: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))来提醒用户注意它不像一个简单的属性。

答案 1 :(得分:1)

这个怎么样?

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

这样您就不会更改已设置的值。

答案 2 :(得分:0)

所有“必需”属性都应该在您的类的构造函数中。