在枚举中表示项目状态的优雅方式
本文关键字:方式 状态 项目 枚举 表示 | 更新日期: 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;
}
}
}