C#の列挙型(enum)で文字列(string)を取得するために、拡張メソッドを使いました。
C#の列挙型(enum)では、許容される型が以下のように数値に制限されています。
- byte
- sbyte
- short
- ushort
- int
- uint
- long
- ulong
( https://msdn.microsoft.com/ja-jp/library/sbbt4032.aspx を参照)
Javaより後発のC#なのに、どういうわけか、C#ではJavaでenumを扱うようにstringなどを使用することができません。
これって実は微妙に不便なんですよね。
C#のenumでstringなどの許容されていない型を使用する方法を調べてみると、拡張メソッドを利用するとよいようです。
まず、enumとは何なんでしょうか?
enum (列挙型)とは
enum (列挙型)とは、データベースやプログラミング言語などにおけるデータ型の一つで、複数の異なる定数を一つの集合として定義するものです。
多くのプログラミング言語では “enum” の略号で示されます。
範囲や選択肢が限定されているデータを扱う場合、整数などに対応付けて記述することがよくありますが、それでは値と内容の対応関係が分かりにくくなってしまいます。
そのような場合、列挙型を用いて各定数をその内容を表すシンボル名を列挙して定義し、その値を用いるようにすることで、コードの可読性が上がります。
個人的には、enumを用いることで、ちょっと上手のプログラマーっぽく見えるので好きですね。
それでは、C#でenumで文字列(string)を扱うサンプルコードを示します。
C#のenumで文字列を扱うサンプルコード
ここでは、例として、血液型を表す「A型」「B型」「AB型」「O型」をenumで定義してstring型で血液型の文字列を取得する方法を考えてみます。
サンプルコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
namespace Xxx.Yyy.Zzz { public enum BloodType { BloodType-A, // A型 BloodType-B, // B型 BloodType-AB, // AB型 BloodType-O // O型 } // 拡張クラス public static class BloodTypeExt { // 拡張メソッド public static string ObtainBloodType(this Bloodtype value) { string[] values = {"A型", "B型", "AB型", "O型"}; return values[(int)value]; } } } |
拡張クラスは静的クラス(static)として定義する必要があります。
拡張メソッドは静的メソッド(static)として定義する必要があります。
C#のenumでは明示的にキャストすることで、何番目に定義されたかをint型で取得することが可能です。
このサンプルの例ではenum定義が
- BloodType-A
- BloodType-B
- BloodType-AB
- BloodType-O
の4つなので、int型にキャストすると
- 0 (BloodType-A)
- 1 (BloodType-B)
- 2 (BloodType-AB)
- 3 (BloodType-O)
となります。
以上のことからサンプルソースの動作は、以下のようになります。
BloodTypeExt.BloodType-A.ObtainBloodType()
は “A型”
BloodTypeExt.BloodType-B.ObtainBloodType()
は “B型”
BloodTypeExt.BloodType-AB.ObtainBloodType()
は “AB型”
BloodTypeExt.BloodType-O.ObtainBloodType()
は “O型”
既存クラスに変更を加えずに機能拡張が可能という「拡張メソッド」は便利です。
Javaでは当然扱えていたのですが、C#でもこれが出来ると可読性が上がって便利です。
↓C#で役に立つ本をまとめました。
この記事、お役に立てればシェアしていただけるとうれしいです。
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント