DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字列型の列挙体

環境/言語:[.NET 3.5 Windows 7、VB.NET]
分類:[.NET]

「文字列の列挙体」
http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx
の記事を読みました。

Enum 型のメリットの一つとして、
その値グループのうちのどれかを取りうることを明示できることがあると思います。

Enum Fruits
 Apple
 Banana
 CCLemon
End Enum

Public MyFruit As Fruits

上記の場合、MyFruit は、Apple か Banana か CCLemon のどれかだとわかります。( 0 か 1 か 2)
ご投稿にあるリフレクションを利用した方法や、クラスの静的フィールドを利用する方法では、いずれも、このようなカテゴリ分けはできず、String 型として定義された変数にセットされることになると思います。

Public MyFruit As String ' ←ここが String になる。

String 型ではなくて、あるグループのうちのどれか、ということを明示できるような方法があれば、もっと Enum っぽさが出ると思うのですが、そういう観点からいい方法はないでしょうか?

あるカテゴリ Oyatsu
 Ame
 Banana
 CCLemon
End カテゴリ

Public MyOyatsu As Oyatsu ' ← Oyatsu カテゴリに属することを明記できる

MyOyatsu は、Ame か Banana か CCLemon のどれかで、文字列型なんだな、とわかる方法があれば
より Enum の文字列版っぽくなると思うのですが。

質問だけで、何もアイデアがなくてすみません。
むしろ、こういう角度から探したら、ほかにもアイデアが湧くのでは、というアイデアだと思って下さいorz
■No31512に返信(ぶいびーびーぶいびーさんの記事)

http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx
の記事に対しコメントされているToStringを使えばいいんじゃないかな。
■No31513に返信(shuさんの記事)
> ■No31512に返信(ぶいびーびーぶいびーさんの記事)
>
> http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx
> の記事に対しコメントされているToStringを使えばいいんじゃないかな。
>

わかりました。

夏になると部屋が暑くなって作業できなくなりますね。
今のうちに作業勧めます。
  • 題名: Re[3]: 文字列型の列挙体
  • 著者: ぶいびーびーぶいびー
  • 日時: 2013/05/12 5:07:46
  • ID: 31516
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No31515に返信(ぶいびーびーぶいびーさんの記事)
> ■No31513に返信(shuさんの記事)
>>■No31512に返信(ぶいびーびーぶいびーさんの記事)
>>
>>http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx
>>の記事に対しコメントされているToStringを使えばいいんじゃないかな。
>>
>
> わかりました。
>
> 夏になると部屋が暑くなって作業できなくなりますね。
> 今のうちに作業勧めます。
解決済み!
  • 題名: Re[1]: 文字列型の列挙体
  • 著者: じゃんぬねっと
  • 日時: 2013/05/12 7:54:14
  • ID: 31520
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No31512に返信(ぶいびーびーぶいびーさんの記事)
> 「文字列の列挙体」
> http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx
> の記事を読みました。

えーっと、その記事の作成者です。
古くてレベルの低いお遊び記事で申し訳ないです。
そういうわけで一応責任とっておこうと思います。

その記事は見た目がマジック ストリングそのものだけど、
後で一斉に変更できたらなんていう局所的な目的のものです。

> Enum 型のメリットの一つとして、
> その値グループのうちのどれかを取りうることを明示できることがあると思います。

という目的なら素直に enum を使った上でカスタム属性に目的の「文字列」を定義して情報を拡張するとか、
(取得する時は拡張メソッドとの相性がよろしいです)
あるいは... ご自身でも辿りついているようですが、

> Public MyFruit As String ' ←ここが String になる。
> String 型ではなくて、あるグループのうちのどれか、ということを明示できるような方法

Java の enum に近いようなクラスを自作すれば良いです。
(私は Java の enum が好きなのでこちら推し)

これにはいくつかパターンがあると思います。
単純な例だと、たとえばこんな基底クラスを用意しておいて、

Public MustInherit Class CustomEnumBase(Of TKey, TValue)

    Private key As TKey
    Private value As TValue

    Public Sub New(ByVal key As TKey, ByVal value As TValue)
        MyClass.key = key
        MyClass.value = value
    End Sub

    Public Overrides Function ToString() As String
        Return MyClass.value.ToString()
    End Function

End Class

こんな風にメンバを定義します。

Public NotInheritable Class MyCoke
    Inherits CustomEnumBase(Of Integer, String)

    Public Shared ReadOnly Member1 As New MyCoke(1, "Pepsi NEX")
    Public Shared ReadOnly Member2 As New MyCoke(2, "Pepsi Special")

    Public Sub New(ByVal key As Integer, ByVal value As String)
        MyBase.New(key, value)
    End Sub

End Class

比較などが必要な場合は別途 compare メソッドと演算子のオーバーロードを使うとそれっぽく見えるかと思います。
メンバの管理に Dictionary を使ったりすると、より簡単で強力なカスタム列挙型が作れるでしょう。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板