2012-06-21 5 views
2

다른 옵션을 메서드의 매개 변수로 전달하는 방법을 찾고 있습니다. 사용자가 6 가지 옵션 중 하나 또는 모두를 선택할 수 있다고 가정 해 봅시다. 그래서 그는 모든 옵션을 선택할 수있는 유일한 옵션 1, & 4 2 만 옵션 1, 3, 5 & 6 등 ...다른 옵션을 메서드에 전달

어떻게 주위에 효과적으로 전달합니까?

난 당신이 비트 추가 할 수 있기 때문에 열거를 사용하여 생각했지만, 내가 거기에서 이동하는 퍼즐의 다음 조각을 누락 :

public void Foo(byte selectedOptions) 
{ 
    // How do I check whether an option has been selected?? 
    if (selectedOptions >= Option.Whatever) DoThis(); 
} 
:

내 방법은 다음과 같이 될 수

: 그래서

당신은 내가하고 싶지 않아 무엇

은 ... 내가 종류의 비트 단위의 비교에의 붙어있어이도 올바른 방법입니다 궁금 참조

아이디어가 있으십니까?

답변

6

이동

[Flags] 
public enum FlagTest 
{ 
    None = 0x0, 
    Flag1 = 0x1, 
    Flag2 = 0x2, 
    Flag3 = 0x4 
} 

: 또한 [Flags]

등으로 열거를 장식한다

public void Foo(Option selectedOptions) 
{ 
    if ((selectedOptions & Option.Whatever)>0) 
    { 
    // whatever 
    } 
} 

+1

고마워, 이것이 내가 찾고 있었던 것이다. – Davio

1

사용자 PARAMS 키워드 :

public void Foo(params string[] options); 

은 다음 함수에 PARAMS 무제한 문자열을 전달하고, 문자열 [] 배열을 읽을 수 있습니다.

또는 사용하여 열거 (IMHO는 더 나은 방법입니다) :

[Flags] 
public enum MyEnum { 
    Value1 = 1, 
    Value2 = 2, 
    Value3 = 4, 
    Value4 = 8, 
    Value5 = 16, 
    Value6 = 32, 
} 
public void Foo(MyEnum value){ 
    if (value & MyEnum.Value1 > 0){ 
     // we have Value1 passed 
    } 
} 

등이 전화 :

Foo(MyEnum.Value1 | MyEnum.Value4 | MyEnum.Value10); 

열거 값이 순차적 안 - 1,2,3,4처럼은 , 5, 플래그 값 -2^x. 대한

열거 플래그와
[Flags] 
public enum Option 
+2

.NET 4에서는'if (value.HasFlag (MyEnum.value1))'도 사용할 수 있습니다. – Henrik

0

당신이 원하는 당신의 깃발 에스 선출 여러 옵션이 플래그가 사용 비트 및 설명하는지 달성하는 방법

if ((testItem & FlagTest.Flag1) == FlagTest.Flag1) 
{ 
    // Do something 
} 
+0

설정하려면 OR로 설정되어 있는지 확인해야합니다. 당신의 대답은 정확하지 않습니다. –

+0

아니요, AND 여야합니다 :) OR는 항상 사실입니다. – podiluska

+0

무슨 뜻인지 알 겠어. Foo (OptionA | OptionB) {selectOptions & OptionA ... –

0

전통적 있었다 몇 선택되어 있는지 확인하려면 비트 또는

FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2; 

를 사용합니다.

public class FooOptions 
{ 
    bool Fizz; 
    bool Buzz; 
    bool Boom; 
} 

... 다음 메소드의 호출자는 true로 설정 해당 필드와 그의 인스턴스를 전달합니다 : 첫 번째는 구조체를 정의하는 것입니다.

public enum FooOptions 
{ 
    Fizz = 1, 
    Buzz = 2, 
    Boom = 4, 
} 

... 당신은 다음과 같은 것을 사용 테스트 것 : 의미,

if ((options & FooOptions.Fizz) == FooOptions.Fizz) { ... } 

요즘, 그러나, C 번호는이 옵션 및 명명 된 매개 변수

플래그 열거 형은 다른 해결책이었다 귀하의 최종 접근법 (원하지 않는 방법)은 가장 합리적인 방법입니다.

public void Foo(bool fizz = false, bool buzz = false, bool boom = false) 
{ 
    ... 
} 

... wh 당신은 옵션 세트를 개최 HashSet<YourEnum>을 사용할 수 있습니다

Foo(fizz: true, boom: true); 
Foo(buzz: true); 
+0

에 명명 된 매개 변수 솔루션을 사용하는 경우 솔루션 내에서 매개 변수를 전달하는 방법은 무엇입니까? 분명히 이것은 개별 메서드 호출에 연결됩니까? – podiluska

+0

개별 메서드 호출은 모든 질문에 대한 것입니다. 앱의 수명이 다할 때까지 옵션을 유지해야한다면 클래스 (또는 영구 저장소)가 훨씬 더 현명한 접근 방식입니다. –

0

: ICH 당신은 다음과 같은 매개 변수의 순열로 호출 할 수 있습니다. 단지 enumContains() 방법은 괜찮 그러나 저에 사용

public void Foo(HashSet<YourEnum> selectedOptions) 
{ 
    if(selectedOptions.Contains(YourEnum.Option1)) 
     DoSomething(); 
} 

옵션에 대한 테스트를 더 읽기 방법입니다.

관련 문제