我使用枚举来描述不同的项目状态:
[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为真。
所以我的问题是,如果有人知道以更优雅的方式处理这个问题的另一种方法。 (也许有两种不同的枚举类型?)
提前感谢!
答案 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;
}
}
}