◆ HasFlag メソッドで指定した enum 値のビットを全部持ってるか判断できる
◆ enum の拡張メソッドで全部もしくはどれかを持ってるかを判断するのを作った

HasFlag

enum の値がある値の中のどれかなら という処理を簡単にできる機能がデフォルトでないかな と探していたら HasFlag というメソッドを見つけました
enum の値全部で使えるけどどういう動きするのかと調べてみると

> public enum N
. {
. Zero, One, Two, Three,
. }

と enum 型があるときに

> N.Zero.HasFlag(N.Zero)
true
> N.Zero.HasFlag(N.One)
false
> N.One.HasFlag(N.Zero)
true
> N.Three.HasFlag(N.Two)
true
> N.Two.HasFlag(N.Three)
false

という動きです
ビットフラグとして 指定した enum 値のフラグをすべて持っているかを判断してくれるメソッドです

> Convert.ToString((int)N.Three, 2)
"11"
> Convert.ToString((int)N.Two, 2)
"10"

2 進数で値を見て Three は 11 で Two は 10 となっているので Three は Two のフラグは持っています
逆に Two は一桁目のビットが 0 なので Three のフラグは持っていません

One か Two のどっちかなら というときなら
> (N.Two | N.One).HasFlag(N.One)
true

と書けますが One や Two がビット単位で独立しているときだけです
Five (110) や Seven (111) とか混ざってくるとうまく動きません

ビットフラグ関係なく enum 値の中のどれかということなら enum に限らない方法で 配列に含むかで確認できます
> new[] { N.One, N.Two }.Contains(N.One)
true
ただ C# の構文だとこの書き方は長めです

JavaScript みたいに配列を [ ] だけで書けると楽なのですけど
const N = { Zero: 0, One: 1, Two: 2, Three: 3 }
;[N.One, N.Two].includes(N.One)

Extension Method

Enum 全体に対する拡張メソッドを作れるので 作ってみました

public static class EnumExtension
{
static public bool all(this Enum en, params Enum[] es)
{
return es.All(e => en.HasFlag(e));
}

static public bool any(this Enum en, params Enum[] es)
{
return es.Any(e => en.HasFlag(e));
}
}
public enum Can
{
Can_A_1 = 1 << 0,
Can_A_2 = 1 << 1,
Can_A = Can_A_1 | Can_A_2,
Can_B_1 = 1 << 2,
Can_B_2 = 1 << 3,
Can_B_3 = 1 << 4,
Can_B = Can_B_1 | Can_B_2 | Can_B_3,
}

var flag1 = Can.Can_A_1;
Console.WriteLine(flag1.any(Can.Can_A, Can.Can_B));
// False

var flag2 = Can.Can_A_1 | Can.Can_A_2;
Console.WriteLine(flag2.any(Can.Can_A, Can.Can_B));
// True

var flag3 = Can.Can_B;
Console.WriteLine(flag3.all(Can.Can_B_1, Can.Can_B_2));
// True

var flag4 = Can.Can_B_2 | Can.Can_B_3;
Console.WriteLine(flag4.all(Can.Can_B_1, Can.Can_B_2));
// False