VB.net の列挙名と列挙値のリストをハッシュ化する必要があったので調べた。
まずは列挙の名前の方。
Dim aNames= [Enum].GetString(GetType(Enum型名))
Debug.Print(String.Join(",", aNames))
次は列挙の値の方。
Dim aValues= [Enum].GetValues(GetType(Enum型名))
Debug.Print(String.Join(",", aValues))
得た列挙名と値のリストを合体させる
'VBでハッシュテーブルを作る
Function createHash(aNamess() As String, aValues() As Integer)
Dim ht As Hashtable = New Hashtable
For Each item In aNamess.Select(Function(Value, Index) New With {Value, Index})
Dim key As String = item.Value ' コレクションの要素
Dim index As Integer = item.Index ' ループのインデックス
Dim val As Integer = aValues(index)
ht.Add(key, Val)
Next
Return ht
End Function
なお、ソース内で使用するenumの列挙子の情報(enumの型名、列挙子の名前、列挙値)を得ることはできるが、参照元でgetEnumValInfo(EnumFuga.Hero)の様に
Enumの列挙子を指定しないうまくいかない。
Public Function getEnumValInfo(enumItem As Object) As String()
Dim enumType = enumItem.GetType()
Dim enumItemName = [Enum].GetName(enumType, enumItem)
Return {enumType.Name, enumItemName, enumItem}
End Function
Public Enum EnumRcIndex
TypeName
ItemName
ItemValue
End Enum
あとは変換先のEnumのハッシュを作り、 変換元のEnum列挙子の情報を得て、先のハッシュに読ませれば・・・
Dim strCollectionB() As String = [Enum].GetNames(GetType(EnumB))
Dim intCollectionB() As Integer = [Enum].GetValues(GetType(EnumB))
Dim aRc1 = getEnumValInfo(EnumA.Hero)
Dim rc = enumHtB(aRc1(EnumRcIndex.ItemName))
トあるEnumAのHeroから別のEnumBのHero値を得られるハズ。
あと列挙型のデータ型は、Integer以外にもStringも指定できるから抽象型(T)で書かないといけないのかもしれない。
それにしても、うーむ、気が付かないうちに、Pythonにでも侵されていたのかな。全然VBコードじゃない。てか、ここまでくると、サンプルの多いC#の方が読みやすいだろうw(普通に
ここまで来るとVBを使う用途は
使い古したVBソースは二度と書き変えたくない。 ~ Slanirish Warlander 「変装現実」より~
以外にありえないだろう。(爆笑
参考