Enum.Parse

以下のような列挙型が定義されていたとして、

[Flags]
public enum Donaiyanen : int
{
    FOO = 0x01,
    BAR = 0x02,
    HOGE= 0x04,
}

Enum.Parseは以下のような演算子で演算された列挙を文字列からパースできないのね。

string enumStr = "FOO | BAR | HOGE";
object result = Enum.Parse(typeof(Donaiyanen), enumStr); //System.ArgumentException発生

あわよくばと思ったんだが、まあ当たり前といえば当たり前か。

ならば自身でパースでやるとして、列挙型を演算するケースを考えてみる。C#の論理演算子

&   |   ^   !   ~ 

とあるが、実際には&と|を意味がある区切り文字と考えれば十分だろう。ならば... って、ここまで考えたが、だったら評価式として評価したほうがよほど楽だな、と思い始めてきた。

しかし、しかし。

評価式もこのままの形式だと上手く評価できないようで、面倒だなと思っていたのだがふと思いつく。
列挙の数にもよるのだろうが、3項程度であれば必要に応じた値を最初から用意してやれば済むことではないか。

[Flags]
public enum Donaiyanen : int
{
    FOO = 0x01,
    BAR = 0x02,
    HOGE= 0x04,
    ALL = (FOO | BAR | HOGE)
}

これなら3つ入りの値は文字列"ALL"で指定できるので

string enumStr = "ALL";
Donaiyanen all = Enum.Parse(typeof(Donaiyanen), enumStr) as Donaiyanen; //ok!

なんだ、これでいいじゃないか。
最初のパースが出来ない状態から、最後の列挙候補を増やす案まで一足飛びに飛躍できないのが私の愚鈍なところだ。