Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

整数値と列挙体の型変換

ENUM列挙体の実態はInt32で使うケースが多いです。
整数値で要素を確定し,列挙体の型のインスタンスを使う必要があり、コーディングしています。
 ( flag指定のない列挙体で、組み合わせをOKとする仕様。組み合わせた数値で渡されます。
   この手の列挙体が多くあるアプリでの出来事。
 )
当然、型を合わせてあげる必要がありますので/Ctype/Dirctcast等でCastをします。
例)

Public Enum 列挙A
    AAA = 0
    BBB = 20
    CCC = 30
End Enum
'==
Public Sub 関数A( x as 列挙A)
   なんやかんや
End Sub
'===
public Sub main()
   関数A( DirectCast(20,列挙A))
end Sub
 などです。
このキャスト部分が違う型で頻繁に使われるので, DirectCast(20,列挙A)の列挙Aの部分をパラメタ化しようとしましたが、旨くいかなのですね。

第二引数の型は object as Type で, string,int32等の型を直接記述しないとコンパイラに叱られます。

        Dim TYPE_A As Type = GetType(列挙A)

        Dim C As 列挙A = DirectCast(i, typeA) 'エラー : 型未定義
        Dim C As 列挙A = DirectCast(i, GetType(列挙A)) 'キーワードは型の名前を指定しません。
いずれもダメ。

ジェネリックではどうか
    '===
    Public Function MyCast(Of T)(ByVal a As Object) As T
        Return DirectCast(a, T)
    End Function
    '===
を規定しても,call側では,
       Dim c As 列挙A = MyCast(Of 列挙A)(i)
とOf 列挙A と記述するので同じ。

苦肉の策で
   dim mytype as type = GetType(列挙A)
   dim rc as integer = 50 '  列挙A.BBB or 列挙A.CCC 'の値
          dim o as object = [Enum].Parse(mytype, rc.ToString, True): <== 数値でも Parseしてくれるのですね。

とすればどうにか,任意の列挙体のインスタンスは求められました。
しかし, 結果がobjectになるし, rc.ToStringを使うしで,スマートとは言えません。
 エレガントへの道は厳しいですね。

投稿日時 : 2007年1月22日 16:52

Feedback

# re: 整数値と列挙体の型変換 2007/01/22 17:17 じゃんぬねっと

最初から数値で扱う予定があるなら、System.Enum は使わないです。

タイトル
名前
Url
コメント