C# 将(大量使用的)布尔值转换为多状态值

C# 将(大量使用的)布尔值转换为多状态值,c#,C#,我需要更新一个类。它有一个布尔值,例如IsTypeA 系统中目前有两种情况,即1。是A型还是2型。不是IsTypeA 在标准条件下,如果(IsTypeA)do X else do Y,这在很多地方都会引用。它也用于集成和外部数据,因此我不允许更改它。我只能在班上加点 我们现在有了一个新的条件,所以IsTypeA需要有3个状态 如果有另一个布尔值(比如IsTypeB),这似乎有点不太好,它胜过了IsTypeA布尔值。如果使用另一种类型,比如TypeC,它也会使代码难以理解和垃圾化 处理这种情况的最

我需要更新一个类。它有一个布尔值,例如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
are
false
的信息与对象的实际状态无关


因此,如果之前的实现声明对象是
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
are
false
的信息与对象的实际状态无关


因此,如果之前的实现声明对象是
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
are
false
的信息与对象的实际状态无关

因此,如果之前的实现声明对象是
A
B
,因此
IsTypeA
true
false
,那么,现在,对象可以是
A
B
C
,但本质上仍然是这样的:对象
A
产生
IsTypeA==true
B
s和
C
产生
IsTypeA==false
,然后使用@Charles解决方案:在enum中提供新的详细信息,同时保留向后兼容性。但如果不是这样,即对象
C
既不是
true
也不是
false
(即