Я использую перечисление для описания различных состояний проекта:Элегантный способ представления состояния проекта в перечислении
[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 == Open true.
Итак, мой вопрос: если кто-то знает альтернативный способ справиться с этой проблемой более элегантным способом. (возможно, с двумя разными типами перечислений?)
спасибо заранее!
благодарит за ответ. У меня также было более или менее такое решение. Но я подумал, может быть, есть более короткая форма. Поскольку мой реальный ProjectStatus имеет около 10 состояний, а состояния CanXxxx более сложны, как описано выше. Но я думаю, что мне нужно жить таким образом :-). – rhe1980
@ rhe1980: особенно если состояния сложны, не включайте их в перечисление, а используйте функции для вычисления. – Tigran