我有一个具有两个布尔属性的类 - A,B。
我想添加一个限制,使A和B不能同时为假。 是否有一些我可以应用于Class的属性,使得A = false和B = false变得无效?
答案 0 :(得分:3)
没有内置任何东西。你自己需要写这个逻辑。有三种方法可以做到这一点,按顺序排列"良好做法":
用枚举替换两者:当您有两个互斥状态时,最好将它们组合成一个具有多个状态的值。如果你真的需要它们作为单独的布尔值,你可以编写只检查中心状态的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; } }
在业务逻辑层中强制执行:在这种情况下,您只需在UI中或输入来自的任何位置强制执行限制。每当你尝试切换一个时,你检查另一个的状态并适当地通知/改变。
写入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.
}
}
选择#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); } }