2011-08-02 7 views
3

에 열거 플래그를 사용하는 방법 내가 내가하려고하는 것은 이것이다 :C#을 - 특정한 방식으로

[Flags] 
public enum Actions 
{ 
    Action1 = 0x01, 
    Action2 = 0x02, 
    Action3 = 0x04 
} 

개체로 시작하는 7로 설정하는 작업 플래그를 가지고있다. 그런 다음 개체는 사용 가능한 모든 작업을 수행 할 수 있습니다. 그러나 여기에 키커가 있습니다.

- 액션 1, 2 조, 3 조

- 액션 1 조 1 조 3

- 액션 1 조 1 조 2

: 오브젝트이 결합 동작을 수행 할

- 액션 1, 액션 1, 액션 동작 (1), 최대 개까지 세 번을 사용할 수 있지만

1 그래서, 행동 2, 3 번만 사용할 수 있습니다. 동작 2 또는 동작 3이 사용되면 동작 1은 두 번만 사용할 수 있습니다. 이 문제를 해결하는 가장 좋은 방법입니까? 아니면 내가 처리 할 수있는 새 개체를 만들어야합니까? 열거 형을 사용하여이 작업을 수행하고 싶지만, 내 인생에서이 작업을 수행하거나 웹에서 이와 같은 작업을 수행하는 방법을 찾아 낼 수는 없습니다.

제공 될 수있는 도움에 대해 미리 감사드립니다.

+0

(정규, 비 플래그) 열거 형 –

+0

코드 형식을 확인하거나 http://stackoverflow.com/editing-help – Amy

+0

을 참조하십시오. 이해한다면, enum (플래그)을 사용하여 허용되는 동작을 식별 할뿐만 아니라 행동이 발생해야합니까? – CodingGorilla

답변

0

나는 내가 원하는 방식으로 작동하도록하기 위해 이것을하는 것을 힘썼다.

나는 여전히 통해 리팩토링 갈 필요가 있지만, 내 필요를 위해 지금까지 작동합니다

public Actions Actions{get; set;} 

public bool UseAction(Actions action) 
     { 
      bool mReturn = false; 

      if (action == Actions.Action2) 
      { 
       if ((this.Actions & Actions.Action2) == Actions.Action2) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~action; 
       } 
       else if ((this.Actions & Actions.Action3) == Actions.Action3) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~Actions.Action3; 
       } 
       else 
       { 
        mReturn = false; 
       } 
      } 
      else if (action == Actions.Action3) 
      { 
       if ((this.Actions & Actions.Action3) == Actions.Action3) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~action; 
       } 
      } 
      else 
      { 
       if ((this.Actions & Actions.Action1) == Actions.Action1) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~action; 
       } 
       else if ((this.Actions & Actions.Action3) == Actions.Action3) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~Actions.Action3; 
       } 
       else if ((this.Actions & Actions.Action2) == Actions.Action2) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~Actions.Action2; 
       } 
      } 

      return mReturn; 
     } 
3으로 설정하고 값에 의해 감소되는 actionsLeft에 대한 외부 추적이 쉽게 보일 수있을 것입니다
0

나는이 작업을 수행하는 열거 형을 사용하고 싶습니다,하지만 난 할 수 없습니다 ...

당신은 확실히 각 작업에 대한 상수를 정의하는 열거 타입을 사용할 수 있지만, 당신이 필요합니다 규칙을 시행하기 위해 일부 논리를 구현해야합니다. 열거 형은 그렇게 할 수 없습니다. 열거 형 값을 사용하여 유형을 첫 번째 단계로 결정하는 이러한 작업을 관리하는 데 사용되는 클래스를 만들 수 있지만 지정된 작업이 지정된 시간에 유효한지 여부를 확인하기 위해 일부 상태를 유지해야합니다.

0

enum 플래그를 사용하면 같은 값을 두 번 결합 (OR) 할 수 없으므로 찾고있는 유효성 검사 종류를 수행 할 수 없습니다. 클래스를 생성하거나 컬렉션을 사용하고 규칙 논리를 적용해야합니다. 어쨌든 이것을해야만하기 때문에 Flags 속성에 대해 걱정할 필요가 없습니다. 그것은 당신에게 유용하지 않습니다. 이 경우 어쨌든.

그러나 네 개의 사례가 나열된 네 가지 예로 제한되는 경우 각 사례 중 하나를 나타내는 네 개의 값이있는 열거 형을 사용할 수 있습니다. 비트 플래그 지정은 여전히 ​​여기서는 유용하지 않지만 열거 형을 통해 규칙을 시행해야합니다.

2

열거 형은 단일 동작 만 가리 킵니다. 당신이 행동의 조합을 가지고 있다면, 나는 그것들을 조직 할 수있는 집단을 제안 할 수 있습니다.

예 :

List<Actions> _actionCombos = new List<Actions>(3); 

_actionsCombos.Add(Action.Action1); 
_actionsCombos.Add(Action.Action1); 
_actionsCombos.Add(Action.Action1); 

이 모든 1S의 조합이 될 것입니다. 액션 조합을 결정하는 또 다른 변수가있는 것 같습니다. 그래서, 당신은 적절한 액션 조합을 리턴하기 위해 그 값을위한 로직을 만들 수 있습니다 (존재한다면).

관련 문제