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を使うしで,スマートとは言えません。
エレガントへの道は厳しいですね。