列挙体の値の列挙と、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 プロパティ | トップページ | 謹賀新年 »
「覚え書き」カテゴリの記事
- プロジェクトにXMLスキーマを取り込む場合の注意点(2012.10.14)
- VS2008 XMLスキーマのプロジェクト取り込み(2012.09.17)
- DrawRectangle と Pen の設定による描画位置(2011.09.24)
- タイトルバーのないフォームの移動(2011.09.23)
- TextBox のマウス位置に該当する行・桁位置を求める(2011.02.13)
この記事へのコメントは終了しました。
コメント