System.Enumクラスには列挙型のすべての名前を得るメソッドもある。List 16-12はそれを用いた例である。
  1: using System;
  2: 
  3: namespace Sample012
  4: {
  5:   enum Era
  6:   {
  7:     Meiji,
  8:     Taisho,
  9:     Showa,
 10:     Heisei
 11:   }
 12:   class Class1
 13:   {
 14:     [STAThread]
 15:     static void Main(string[] args)
 16:     {
 17:       string [] names = Era.GetNames( Type.GetType("Sample012.Era") );
 18:       foreach( string s in names )
 19:       {
 20:         Console.WriteLine( s );
 21:       }
 22:     }
 23:   }
 24: }
これを実行するとFig.16-12のようになる。
17行目のGetNamesメソッドは、引数の型の列挙型に含まれるすべての名前を、文字列の配列として返す。これを調べることで、列挙型に含まれるすべての名前を容易にプログラム中で知ることができる。
今度は反対に、名前ではなく、数値の一覧を取得する方法を説明する。List 16-13がそれを記述した例である。
  1: using System;
  2: 
  3: namespace Sample013
  4: {
  5:   enum Era
  6:   {
  7:     A=1,
  8:     B=20,
  9:     C=300,
 10:     D=4000
 11:   }
 12:   class Class1
 13:   {
 14:     [STAThread]
 15:     static void Main(string[] args)
 16:     {
 17:       System.Array values = Era.GetValues( Type.GetType("Sample013.Era") );
 18:       foreach( int n in values )
 19:       {
 20:         Console.WriteLine( n );
 21:       }
 22:     }
 23:   }
 24: }
これを実行するとFig.16-13のようになる。
GetValuesメソッドは、ある列挙型に含まれる数値の一覧表を配列として返す機能を持つ。引数は、GetNamesメソッドと同じである。戻り値はSystem.Array型だが、これはすべての配列のスーパークラスに当たるもので、どんな配列を渡すのにも使用できるデータ型である。列挙型は、どんな数値型で表現するかプログラマーが指定できるので、このような汎用的なデータ型で戻ってくるのである。
外部との入出力に列挙型の名前を使う場合、入力された文字列を列挙型の値に変換しなければならない。そのために、System.EnumクラスにはParseメソッドが存在する。このメソッドは、Taishoなどの文字列を入力して、その文字列を解析し、それが指定列挙型のTaishoであることを突き止めて、その値を返す。List 16-14はそのメソッドを使用したサンプル・ソースである。
  1: using System;
  2: 
  3: namespace Sample014
  4: {
  5:   enum Era
  6:   {
  7:     Meiji,
  8:     Taisho,
  9:     Showa,
 10:     Heisei
 11:   }
 12:   class Class1
 13:   {
 14:     [STAThread]
 15:     static void Main(string[] args)
 16:     {
 17:       string target = "Taisho";
 18:       Era x = (Era)Enum.Parse( Type.GetType("Sample014.Era"), target );
 19:       Console.WriteLine( x );
 20:       Console.WriteLine( x.GetType().FullName );
 21:     }
 22:   }
 23: }
これを実行するとFig.16-14のようになる。
18行目が実際にParseメソッドを使用した例である。このメソッドの最初の引数は、列挙型の型である。2番目の引数は、変換する文字列を指定する。このメソッドから戻ってくる値は、汎用的なobject型なので、「(Era)」のようにキャストしてやる必要がある。19行目の出力結果で、正しい値になっていることが分かると思うが、本当にEra型の値であることを示すために、20行目も追加してみた。確かに、ConsoleApplication15.Era型であることが分かると思う。
列挙型の値から対応する名前を得る方法はすでに説明したが、これとは少し違う方法もある。List 16-15は、それを使用した例である。
  1: using System;
  2: 
  3: namespace Sample015
  4: {
  5:   enum Sample
  6:   {
  7:     Alpha,
  8:     Bravo,
  9:     Charlie=10,
 10:     Delta=11
 11:   }
 12:   class Class1
 13:   {
 14:     [STAThread]
 15:     static void Main(string[] args)
 16:     {
 17:       Sample sample = Sample.Delta;
 18:       string name1 = sample.ToString();
 19:       Console.WriteLine( name1 );
 20:       string name2 = sample.ToString("G");
 21:       Console.WriteLine( name2 );
 22:       string name3 = sample.ToString("X");
 23:       Console.WriteLine( name3 );
 24:       string name4 = sample.ToString("D");
 25:       Console.WriteLine( name4 );
 26:     }
 27:   }
 28: }
これを実行するとFig.16-15のようになる。
列挙型の値にはToStringメソッドを利用できる。ToStringメソッドはすべてのクラスが持つメソッドなのだが、列挙型では、値に対応する名前を返すように実装されている。そのことが、17〜19行目の結果から分かると思う。しかし、列挙型のToStringメソッドはそれで終わりではない。引数にフォーマット文字列を指定して、複数のフォーマットで文字列に変換することができる。20〜21行目のように「G」を指定した場合は名前を返す。22〜23行目のようにXの場合は16進数の文字列として返す。24〜25行目のようにDの場合は10進数の文字列として返す。
このほか、ToStringメソッドには、フォーマット機能を持つインターフェイスを指定して変換する機能などもある。使いこなせば、列挙型はより強力なツールになるだろう。
『新プログラミング環境 C#がわかる+使える』
 本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て一部分を転載したものです。
【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「C#入門」を大幅に加筆修正し、発行されたものです。連載時はベータ版のVS.NETをベースとしていましたが、書籍ではVS.NET製品版を使ってプログラムの検証などが実施されています。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。
→技術評論社の解説ページ
ご注文はこちらから
Copyright© Digital Advantage Corp. All Rights Reserved.