« Label の AutoSize と Image / Anchor プロパティ | トップページ | 謹賀新年 »

2010年12月30日 (木)

列挙体の値の列挙と、int->Enum 変換

前回、ちらっと汎用のFlags列挙体用プロパティエディタを作成中と発言しましたが、当然ながら汎用性を持たせる為、列挙体の型は動的に取得しなければなりませんし、最後エディタが設定した値も、動的に正しい型の列挙体にして返す必要があります。このあたり、どうやればうまくいくのか、ちょっと悩みましたので、備忘録として書き残しておきます。

・Enumの列挙値全てをint型に変換して取得

object value に列挙型のインスタンスがあるとすると、

int[] enumValues = (int[])Enum.GetValues(value.GetType());

で、列挙値全てが取得出来ます。[ローカル]ウィンドウでは、下図の様に enumValues の各要素が列挙型で表示されますが、気にする必要はない様です。ちゃんと int 型配列として使えます。この表示に惑わされたのは私だけでしょうか?

C#2003の[ローカル]ウィンドウ
C#2005の[ローカル]ウィンドウ(型の表示が少し変更されている)

もっとも、Enum.GetValues は、本来 Array クラスの戻り値なので、正当な書き方は、

Array enumValues = Enum.GetValues(value.GetType());

でしょうね。ただこうすると、その後各要素へのアクセスは、GetValue メソッドを使わないといけないし、結局そこで型キャストも必要なので、かえって面倒になりそうです。

・列挙値を意味するint型をEnumに変換して取得

object value に列挙型のインスタンスがあり、別の int 型 newValue の値を列挙値として扱いたい場合、

object enumValue = Enum.Parse(value.GetType(), newValue.ToString());

で出来ます。int 型から直接変換出来ないのが、ちょっと残念です。


« Label の AutoSize と Image / Anchor プロパティ | トップページ | 謹賀新年 »

覚え書き」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 列挙体の値の列挙と、int->Enum 変換:

« Label の AutoSize と Image / Anchor プロパティ | トップページ | 謹賀新年 »