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

标签 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 为 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;
}

类似这样的事情。您绝对应该改进这段代码,这只是一个示例。

换句话说,将指定逻辑移出函数中的枚举。在枚举中仅保留原始数据。

关于c# - 在枚举中表示项目状态的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782844/

相关文章:

c# - 在类属性中使用泛型类型的名称

c# - 如何将总秒值转换为 'hours minutes seconds' 格式的字符串

gcc - Cmake 更改编译标志

visual-c++ - 在 MSVC 项目中,你推荐什么标志用于发布配置

java - java Android 检查标志位的所有值

c# - 条件 IQueryable 选择 (MVC .NET EF)

c# - 在 EF 6 中自动生成时间戳(代码优先): conversion of a datetime2 data type to a datetime data is an out-of-range value

java - 我可以将所有这些功能放入一个枚举中吗?

java - 将枚举声明为常量?

php - 在 Laravels Eloquent 中获取枚举选项