列挙型を使う
http://blogs.wankuma.com/rti/archive/2007/03/12/66244.aspx
列挙型を使う(その2)
http://blogs.wankuma.com/rti/archive/2007/03/13/66420.aspx
列挙型を使う(その3)
http://blogs.wankuma.com/rti/archive/2007/03/14/66719.aspx
列挙型を使う(その4)
http://blogs.wankuma.com/rti/archive/2007/03/15/66903.aspx
列挙型を使う(その5)
http://blogs.wankuma.com/rti/archive/2007/03/16/67099.aspx
の続きです。
C# で列挙型の実値の型を明示する場合は、以下のように記述します。
public enum 血液型 : short { A, B, O, AB }
しかし、偉い人(W同盟で言う所の N さんとか Jねっとさんみたい立場の人)が、以下のように言ったとしましょう。
「実際の値と表記が異なった場合、重大な問題が生じる(詳細は、その5を参照)ため、実際の値も文字列として記録したい。」
そこで、何も考えずに変更してみます。
public enum 血液型 : string { A, B, O, AB }
すると、エラー一覧に、以下のエラーが表示されてしまいました。
「byte、sbyte、short、ushort、int、uint、long または ulong のいずれかの型を使用してください。」
つまりは・・・・上記のエラーの通りなのです。上記の型以外は、列挙型で取り扱うことができません。
では、列挙型と同様なものを自分で書くとするとどうでしょうか?
public sealed class 血液型 {
public const string A = "A";
public const string B = "B";
public const string O = "O";
public const string AB = "B";
}
これで、列挙型と似たような使い方ができる筈です。
つまりは、列挙型で取り扱えない型の場合、文字型に限らず、上記のように記述すれば良いということになります。
あれ?
ちょっと待って下さい。間違ってますよね?
ものがものだけに、相変わらず危険過ぎる間違いですw(いや、笑ってる場合じゃないですし)
さて、列挙した名前と実際の値として定義される文字列が常に同じことを保証することはできないものでしょうか。
・・・実は、.Net でプログラミングを開始したばかりの頃、僕が実際に持った疑問でした。
以下は、その質問を投げかけた掲示板へのリンクです。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=29612&forum=7&start=0
その疑問を見事に解決して下さったのが、じゃんぬねっとさんでした
(あの頃は優しかったな・・・遠い目)
上記のリンクを読んでいただくと、その経緯がわかります。
また、ご自身のブログにもわかりやすくまとめて下さっています。
http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx
これを読むと、答えは一目瞭然でしょう。
(ジェバンニが一晩でやってくれました)答えは、リフレクションにありました。
しかも、リフレクションを使えば Enum と似たようなメソッドを実装することもできそうです。
#ちなみに、ここ最近のネタの提供(本当に提供なのか?)もじゃんぬねっとさんなのでした。
#いつもお世話になっております <(_*_)>