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

时间:2012-03-20 07:28:30

标签: c# enums flags

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

[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为真。

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

提前感谢!

2 个答案:

答案 0 :(得分:2)

使用不同的值,不要将它们混为一谈,例如

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

检查项目是否可以在功能

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

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

换句话说,将desicional逻辑从函数中移出enum。在枚举中只留下原始数据。

答案 1 :(得分:1)

不直接回答您的问题,我认为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;  
       } 
   }
}