2012-03-20 2 views
1

Я использую перечисление для описания различных состояний проекта:Элегантный способ представления состояния проекта в перечислении

[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.

Итак, мой вопрос: если кто-то знает альтернативный способ справиться с этой проблемой более элегантным способом. (возможно, с двумя разными типами перечислений?)

спасибо заранее!

ответ

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; 
} 

Что-то вроде этого. Вы должны обязательно вставить этот код, это просто пример.

Иными словами, переместите условную логику из enum в функции. В перечислении оставить только необработанных данных.

+0

благодарит за ответ. У меня также было более или менее такое решение. Но я подумал, может быть, есть более короткая форма. Поскольку мой реальный ProjectStatus имеет около 10 состояний, а состояния CanXxxx более сложны, как описано выше. Но я думаю, что мне нужно жить таким образом :-). – rhe1980

+0

@ rhe1980: особенно если состояния сложны, не включайте их в перечисление, а используйте функции для вычисления. – Tigran

1

Не отвечая на ваш вопрос прямо, я не думаю, что CanOpenCanClose должны быть частью 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; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^