在C#类中添加属性的相对约束

时间:2014-05-13 13:44:00

标签: c# .net class properties custom-attributes

我有一个具有两个布尔属性的类 - A,B。

我想添加一个限制,使A和B不能同时为假。 是否有一些我可以应用于Class的属性,使得A = false和B = false变得无效?

2 个答案:

答案 0 :(得分:3)

没有内置任何东西。你自己需要写这个逻辑。有三种方法可以做到这一点,按顺序排列"良好做法":

  1. 用枚举替换两者:当您有两个互斥状态时,最好将它们组合成一个具有多个状态的值。如果你真的需要它们作为单独的布尔值,你可以编写只检查中心状态的get属性。

    public enum MyState
    {
        NoState,
        IsStateA,
        IsStateB,
    }
    public MyState State { get; set; }
    public bool IsStateA { get { return State == MyState.IsStateA; } }
    public bool IsStateB { get { return State == MyState.IsStateB; } }
    
  2. 在业务逻辑层中强制执行:在这种情况下,您只需在UI中或输入来自的任何位置强制执行限制。每当你尝试切换一个时,你检查另一个的状态并适当地通知/改变。

  3. 写入setter逻辑以切换另一个:当设置一个时,设置另一个。

    private bool _StateA;
    private bool _StateB;
    public bool IsStateA { 
      get { return _StateA; }
      set { 
        _StateA = value;
        if (value) _StateB = false; // If this is now true, falsify the other.
      }
    }
    public bool IsStateB { 
      get { return _StateB; }
      set { 
        _StateB = value;
        if (value) _StateA = false; // If this is now true, falsify the other.
      }
    }
    
  4. 选择#1真的是处理"三个状态的最佳方式"像这样的情况,但其他人也会工作。

答案 1 :(得分:1)

为什么不使用简单的get / set逻辑?

private bool a;

public bool A
{
    get { return a; }
    set 
    { 
        if (value == B)
        {
            throw new Exception("A and B have the same boolean value!");
        }
        else
            a = value;
    }
}

或允许A和B设置为任一状态,但有第三个布尔值用于存储逻辑有效性:

public bool IsValid { get { return (A == B); } }