C# 将(大量使用的)布尔值转换为多状态值
我需要更新一个类。它有一个布尔值,例如IsTypeA 系统中目前有两种情况,即1。是A型还是2型。不是IsTypeA 在标准条件下,如果(IsTypeA)do X else do Y,这在很多地方都会引用。它也用于集成和外部数据,因此我不允许更改它。我只能在班上加点 我们现在有了一个新的条件,所以IsTypeA需要有3个状态 如果有另一个布尔值(比如IsTypeB),这似乎有点不太好,它胜过了IsTypeA布尔值。如果使用另一种类型,比如TypeC,它也会使代码难以理解和垃圾化 处理这种情况的最佳做法是什么 我正在考虑做以下工作:C# 将(大量使用的)布尔值转换为多状态值,c#,C#,我需要更新一个类。它有一个布尔值,例如IsTypeA 系统中目前有两种情况,即1。是A型还是2型。不是IsTypeA 在标准条件下,如果(IsTypeA)do X else do Y,这在很多地方都会引用。它也用于集成和外部数据,因此我不允许更改它。我只能在班上加点 我们现在有了一个新的条件,所以IsTypeA需要有3个状态 如果有另一个布尔值(比如IsTypeB),这似乎有点不太好,它胜过了IsTypeA布尔值。如果使用另一种类型,比如TypeC,它也会使代码难以理解和垃圾化 处理这种情况的最
[Obsolete("Please refer to property 'MyType' for new usage", false)]
public bool IsTypeA
{
get { return _isTypeA; }
set
{
_isTypeA = value;
if (value == true)
MyType = EnumMyType.TypeA;
}
}
private EnumMyType _myType;
public EnumMyType MyType
{
get { return _myType; }
set { _myType = value; }
}
(我以前搜索过.find,这与此类似,但在该实例中,开发人员正在更新整个类。我只需要更新类中的一个属性)。添加一个包含三个值TypeA、TypeB和TypeC的枚举
public enum MyType { A, B, C }
然后在类中添加另一个类型为该枚举的属性
public MyType ThreeStateType {get; set;}
并将旧属性委托给新属性(仅使用getter)
如果外部例程需要继续使用IsTypeA属性设置类型,您还可以添加setter
public bool IsTypeA
{
get { return ThreeStateType == MyType.A; }
set { if (value) ThreeStateType = MyType.A; }
// in this case it is not clear what to do
// if the external routine sets IsTypeA to [false]
}
添加具有三个值TypeA、TypeB和TypeC的枚举
public enum MyType { A, B, C }
然后在类中添加另一个类型为该枚举的属性
public MyType ThreeStateType {get; set;}
并将旧属性委托给新属性(仅使用getter)
如果外部例程需要继续使用IsTypeA属性设置类型,您还可以添加setter
public bool IsTypeA
{
get { return ThreeStateType == MyType.A; }
set { if (value) ThreeStateType = MyType.A; }
// in this case it is not clear what to do
// if the external routine sets IsTypeA to [false]
}
添加具有三个值TypeA、TypeB和TypeC的枚举
public enum MyType { A, B, C }
然后在类中添加另一个类型为该枚举的属性
public MyType ThreeStateType {get; set;}
并将旧属性委托给新属性(仅使用getter)
如果外部例程需要继续使用IsTypeA属性设置类型,您还可以添加setter
public bool IsTypeA
{
get { return ThreeStateType == MyType.A; }
set { if (value) ThreeStateType = MyType.A; }
// in this case it is not clear what to do
// if the external routine sets IsTypeA to [false]
}
添加具有三个值TypeA、TypeB和TypeC的枚举
public enum MyType { A, B, C }
然后在类中添加另一个类型为该枚举的属性
public MyType ThreeStateType {get; set;}
并将旧属性委托给新属性(仅使用getter)
如果外部例程需要继续使用IsTypeA属性设置类型,您还可以添加setter
public bool IsTypeA
{
get { return ThreeStateType == MyType.A; }
set { if (value) ThreeStateType = MyType.A; }
// in this case it is not clear what to do
// if the external routine sets IsTypeA to [false]
}
这取决于在更改IsTypeA可用值的范围时,您是否实际更改了它的语义。如果是-那么您显然违反了接口的约定,因为
IsTypeA
是否true
arefalse
的信息与对象的实际状态无关
因此,如果之前的实现声明对象是
A
或B
,因此IsTypeA
是true
或false
,那么,现在,对象可以是A
或B
或C
,但本质上仍然是这样的:对象A
产生IsTypeA==true
和B
s和C
产生IsTypeA==false
,然后使用@Charles解决方案:在enum中提供新的详细信息,同时保留向后兼容性。但如果情况并非如此,即对象C
既不是true
也不是false
(关于IsTypeA
),则您别无选择,只能升级合同(删除IsTypeA
和添加enum对象类型
)。假设外部集成读取对象C
的IsTypeA==false
,但事实并非如此。这取决于在更改IsTypeA
的可用值范围时,您是否实际更改了其语义含义。如果是-那么您显然违反了接口的约定,因为IsTypeA
是否true
arefalse
的信息与对象的实际状态无关
因此,如果之前的实现声明对象是
A
或B
,因此IsTypeA
是true
或false
,那么,现在,对象可以是A
或B
或C
,但本质上仍然是这样的:对象A
产生IsTypeA==true
和B
s和C
产生IsTypeA==false
,然后使用@Charles解决方案:在enum中提供新的详细信息,同时保留向后兼容性。但如果情况并非如此,即对象C
既不是true
也不是false
(关于IsTypeA
),则您别无选择,只能升级合同(删除IsTypeA
和添加enum对象类型
)。假设外部集成读取对象C
的IsTypeA==false
,但事实并非如此。这取决于在更改IsTypeA
的可用值范围时,您是否实际更改了其语义含义。如果是-那么您显然违反了接口的约定,因为IsTypeA
是否true
arefalse
的信息与对象的实际状态无关
因此,如果之前的实现声明对象是A
或B
,因此IsTypeA
是true
或false
,那么,现在,对象可以是A
或B
或C
,但本质上仍然是这样的:对象A
产生IsTypeA==true
和B
s和C
产生IsTypeA==false
,然后使用@Charles解决方案:在enum中提供新的详细信息,同时保留向后兼容性。但如果不是这样,即对象C
既不是true
也不是false
(即