C#のコードを読んでいると、1つのパラメータで複数のenum値を受け入れるメソッドを見かけることがあります。私はいつも、ちょっと素敵だなと思いつつも、調べたことはありませんでした。
さて、今、私はそれが必要かもしれないと思うが、どのようにしたらよいかわからない
というようなことを実現するために
[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として指定する必要があります(あるいは、その設計にない方法で言語を改ざんする必要があります)。
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.
}