在枚举中表示项目状态的优雅方式

本文关键字:方式 状态 项目 枚举 表示 | 更新日期: 2023-09-27 18:28:24

我使用枚举来描述不同的项目状态:

[Flags]
public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened =1 << 2,
   ToMigrate = 1<<3 
}

现在,如果我想从一个州转到另一个州,我必须检查这是否可能。为此,我有了如下扩展枚举的想法:

[Flags]
public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened = 1 << 2,
   ToMigrate = 1<<3,
   CanOpen = Opened | ToMigrate,
   CanClose = Opened,
   CanDelete = Closed | ToMigrate 
}

有了这个解决方案,我可以检查状态变化:

if ((actualState & CanOpen) == CanOpen)
   {
      // open is allowed.
   }

我现在唯一的问题是,例如CanClose和Opened具有相同的基本值,CanClose==Opened为true。

所以我的问题是,如果有人知道用一种更优雅的方式来处理这个问题的替代方法。(可能有两种不同的枚举类型?)

提前感谢!

在枚举中表示项目状态的优雅方式

使用不同的值,不要将它们混淆在一起,例如

public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened = 1 << 2,
   ToMigrate = 1<<3      
}

在检查项目是否可以在功能中关闭后

public bool CanClose(ProjectStatus status)
{
    return (status & Opened) == Opened;
}

像这样的东西。你绝对应该改进这段代码,这只是一个例子。

换言之,将函数中的逻辑从枚举中移出。在枚举中,只保留原始数据。

不直接回答您的问题,我认为CanOpen CanClose不应该是ProjectStatus的一部分,它们是Project的属性。

[Flags]
public enum ProjectStatus
{
   Undefined = 1 << 0,
   Closed = 1 << 1,
   Opened =1 << 2,
   ToMigrate = 1<<3 
}
public class Project
{
   //other properties
   public ProjectStatus Status { get; set; }
   public bool CanOpen
   {
       get 
       { 
             return this.Status == ProjectStatus.Opened 
                 || this.Status == ProjectStatus.StatusToMigrate;  
       } 
   }
}