C#で複数のenum値を渡すには?

C#のコードを読んでいると、1つのパラメータで複数のenum値を受け入れるメソッドを見かけることがあります。私はいつも、ちょっと素敵だなと思いつつも、調べたことはありませんでした。

さて、今、私はそれが必要かもしれないと思うが、どのようにしたらよいかわからない

  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つ以上のDayOfWeekの値を渡せるようにしたいのですが、どうすればいいですか?この特定の列挙型をそのまま使用することはできますか?上記の 3 つのことを行うにはどうすればよいですか?

ソリューション

enumを定義するときに、[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'のEnumeration Typesに関するドキュメントを参照してください。


質問への追記に対応して編集しました。

配列/コレクション/パラメータ配列として渡すようなことをしない限り、その列挙型をそのまま使用することはできません。 そうすれば、複数の値を渡すことができます。 flags構文では、Enumをflagsとして指定する必要があります(あるいは、その設計にない方法で言語を改ざんする必要があります)。

解説 (10)

Reed'さんの回答に賛成です。 しかし、enum を作成するときに、enum の各メンバーの値を指定して、一種のビットフィールドを作成する必要があります。 例えば

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

このようなものには、あなたが求めているものが表れているはずです。

[Flags]
public enum SomeName
{
    Name1,
    Name2
}

public class SomeClass()
{
    public void SomeMethod(SomeName enumInput)
    {
        ...
    }
}
解説 (1)