.NETの組み込みフラグ列挙型操作は、残念ながら非常に制限されています。ほとんどの場合、ユーザーはビット単位の操作ロジックを理解する必要があります。
.NET 4では、ユーザーのコードを簡略化する方法HasFlag
が追加されましたEnum
が、残念ながら多くの問題があります。
HasFlag
与えられた列挙型だけでなく、任意の型の列挙値引数を受け入れるため、タイプセーフではありません。
HasFlag
値がenum value引数によって提供されるフラグのすべてまたは一部を持っているかどうかをチェックするかどうかについては、あいまいです。ちなみにそれはすべてです。
HasFlag
割り当てを引き起こし、ガベージコレクションを増やすボクシングを必要とするため、かなり遅いです。
フラグ列挙型に対する.NETの限定的なサポートが一部であるため、私はOSSライブラリEnums.NETを作成しました。
以下は、.NETフレームワークのみを使用した同等の実装とともに提供される操作の一部です。
フラグを組み合わせる
。ネット flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
フラグを削除
。ネット flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
一般的なフラグ
。ネット flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
フラグの切り替え
。ネット flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
すべてのフラグがあります
.NET (flags & otherFlags) == otherFlags
またはflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
フラグがあります
。ネット (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
フラグを取得
。ネット
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
これらの改善点を.NET Coreに組み込み、最終的には完全な.NET Frameworkを組み込むことを目指しています。ここで私の提案をチェックできます。