C#에서 여러 열거형 값을 전달하려면 어떻게 해야 하나요?

가끔 다른 사람의 C# 코드를 읽을 때 단일 매개변수에 여러 열거형 값을 허용하는 메서드를 볼 때가 있습니다. 항상 깔끔하다고 생각했지만 자세히 살펴본 적은 없었습니다.

이제 필요성이 있다고 생각하지만 어떻게 해야 할지 모르겠습니다.

  1. 이를 허용하도록 메서드 서명을 설정합니다.
  2. 메서드의 값으로 작업합니다.
  3. 열거 형을 정의합니다.

을 정의합니다. <시간 /> 제 특정 상황에서는 다음과 같이 정의된 System.DayOfWeek를 사용하고 싶습니다:

[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{ 
    Sunday = 0,   
    Monday = 1,   
    Tuesday = 2,   
    Wednesday = 3,   
    Thursday = 4,   
    Friday = 5,    
    Saturday = 6
}

요일 값 중 하나 이상을 내 메서드에 전달할 수 있기를 원합니다. 이 특정 열거 형을 그대로 사용할 수 있나요? 위에 나열된 세 가지 작업을 수행하려면 어떻게 해야 하나요?

질문에 대한 의견 (1)
해결책

열거 형을 정의할 때 [Flags]로 속성을 지정하고 값을 2의 거듭 제곱으로 설정하면 이런 식으로 작동합니다.

여러 값을 함수에 전달하는 것 외에는 아무것도 바뀌지 않습니다.

예를 들어

[Flags]
enum DaysOfWeek
{
   Sunday = 1,
   Monday = 2,
   Tuesday = 4,
   Wednesday = 8,
   Thursday = 16,
   Friday = 32,
   Saturday = 64
}

public void RunOnDays(DaysOfWeek days)
{
   bool isTuesdaySet = (days & DaysOfWeek.Tuesday) == DaysOfWeek.Tuesday;

   if (isTuesdaySet)
      //...
   // Do your work here..
}

public void CallMethodWithTuesdayAndThursday()
{
    this.RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
}

자세한 내용은 MSDN의 열거형에 대한 문서를 참조하세요.


질문에 대한 추가 사항에 대한 응답으로 편집합니다.

배열 / 컬렉션 / 매개 변수 배열로 전달하는 것과 같은 작업을 수행하려는 경우가 아니라면 해당 열거 형을 그대로 사용할 수 없습니다. 그러면 여러 값을 전달할 수 있습니다. 플래그 구문을 사용하려면 열거 형을 플래그로 지정해야 합니다(또는 설계되지 않은 방식으로 언어를 변형해야 합니다).

해설 (10)

제 생각에 더욱 세련된 솔루션을 사용하는 것이 해스플라그 ():

    [Flags]
    public enum DaysOfWeek
    {
        Sunday = 1,
        Monday = 2,
        Tuesday = 4,
        Wednesday = 8,
        Thursday = 16,
        Friday = 32,
        Saturday = 64
    }

    public void RunOnDays(DaysOfWeek days)
    {
        bool isTuesdaySet = days.HasFlag(DaysOfWeek.Tuesday);

        if (isTuesdaySet)
        {
            //...
        }
    }

    public void CallMethodWithTuesdayAndThursday()
    {
        RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
    }
해설 (2)

리드의 답변에 동의합니다. 그러나 열거 형을 만들 때 각 열거 형 멤버에 대한 값을 지정해야하므로 일종의 비트 필드가됩니다. 예를 들어

[Flags]
public enum DaysOfWeek
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,

    None = 0,
    All = Weekdays | Weekend,
    Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday,
    Weekend = Sunday | Saturday,
    // etc.
}
해설 (5)

&gt. 아니, 차라리 내 특정 상황 &gt. 시스템.다요프위크 사용할 것

[플래그] '로 사용할 수 없습니다' 시스템.다요프위크 열거도 제어할 수 있기 때문에 이 없다. '이렇게 하면 여러' 데이로프위크 프로파일링하려는 경우 투명지에 받아들이는 방법을 사용할 수 있는 '키워드' params)

void SetDays(params DayOfWeek[] daysToSet)
{
    if (daysToSet == null || !daysToSet.Any())
        throw new ArgumentNullException("daysToSet");

    foreach (DayOfWeek day in daysToSet)
    {
        // if( day == DayOfWeek.Monday ) etc ....
    }
}

SetDays( DayOfWeek.Monday, DayOfWeek.Sunday );

그렇지 않으면 직접 만들 수 있습니다 ' [플래그]' 열거도 기술한 대로, 기타 여러 가지 다양한 고객 환경에 따라 비트단위 주시노라 및 사용

해설 (1)
[Flags]
public enum DaysOfWeek
{
  Mon = 1,
  Tue = 2,
  Wed = 4,
  Thur = 8,
  Fri = 16,
  Sat = 32,
  Sun = 64
}

이 같은 번호를 지정해야 합니다 그 값을 저장할 수 있기 때문에, 그리고 증분할 비트단위 열었다.

그럼 그냥 이 방법을 정의하고 시행하십시오 이넘

public void DoSomething(DaysOfWeek day)
{
  ...
}

그리고 이 같은 일을 호츨

DoSomething(DaysOfWeek.Mon | DaysOfWeek.Tue) // Both Monday and Tuesday

이넘 값 중 하나를 사용하여 patran 같은 작업을 비트단위 확인란 포함됐는지 여부를 확인할 수 있습니다

public void DoSomething(DaysOfWeek day)
{
  if ((day & DaysOfWeek.Mon) == DaysOfWeek.Mon) // Does a bitwise and then compares it to Mondays enum value
  {
    // Monday was passed in
  }
}
해설 (2)

[Flags]
    public enum DaysOfWeek{

        Sunday = 1 
해설 (6)

마크 네 이넘 를 [플래그] 속성. 그 밖에도 당신의 모든 값은 상호 배타적인 (t, 최대 비유하 can& 추가 다른 두 개의 값을 # 39) 등 네 경우엔 1.2,4.8,16.32,64

[Flags]
public enum DayOfWeek
{ 
Sunday = 1,   
Monday = 2,   
Tuesday = 4,   
Wednesday = 8,   
Thursday = 16,   
Friday = 32,    
Saturday = 64
}

받아들이는 방법을 사용할 경우 여러 명이 함께 사용할 수 있는 비트 or 이넘 데이로프위크 연산자 (). 예를 들면 다음과 같습니다.

MyMethod(DayOfWeek.Sunday|DayOfWeek.Tuesday|DayOfWeek.Friday)

, 와 있는지 확인하는 매개변수입니다 map_layer 비트단위 사용하여 특정 멤버 연산자 (&) 함께 멤버 틀렸다니까 확인.

if(arg & DayOfWeek.Sunday == DayOfWeek.Sunday)
Console.WriteLine("Contains Sunday");
해설 (1)

리드 코프시 올바르고 꼭 이래야겠어요 추가합니까 원본 게시물 내가그럴수도있지만, 난 그렇게 할 경우, 칸트, ll 질문하시리니 I& # 39 를 사용할 수 있습니다.

[플래그] 를 사용하는 게 아니라 그 이전 이넘. 내가 할 때 힘을 사용하여 명시적으로 변경하십시오 믿겠군 이넘 값을 두 값을 충돌을 피하기 위해 국기를. 안내선 플라그스타리버트 및 이넘 참조.

해설 (0)

이 질문에 대한 대답, 도움으로 게시하기를.

  1. 플라그스타리버트 클래스 (비교치를 사용 및 사용하지 않는 [플래그] 속성)
  2. [이넘 플래그 속성용] [2]

I feel like it 꽤 잘 안다.

감사합니다.

[2]: # 8480 https://stackoverflow.com/questions/8447/enum-flags-attribute/8480

해설 (0)

이러한 성격의 무언가는 사용자가 찾고 있는 것을 보여 주어야 합니다:

[Flags]
public enum SomeName
{
    Name1,
    Name2
}

public class SomeClass()
{
    public void SomeMethod(SomeName enumInput)
    {
        ...
    }
}
해설 (1)