質問
私は、列挙型を取るユーザーにすべての可能な選択肢を表示し、それらはいずれかを選択し、それをバック通過させることができます機能を作成しようとしています。ジェネリック医薬品は、あなたが列挙型に制限することはできません。私は前後にキャストするコードの作業を持っているが、私はそれは同じ列挙型を受け入れ、返したいと思います。
このコードは、私が好きなようではなく、同様に動作します:
文字列として
パブリック関数getEnumSelection(Windows.Forms.IWin32Window、ByValのsampleValue [列挙]、文字列としてByVal字幕としてとしてByVal所有者) Dim names As String() = [Enum].GetNames(sampleValue.GetType)
Using mInput As New dlgList
mInput.ListBox1.Items.Clear()
For Each name As String In names
mInput.ListBox1.Items.Add(name)
Next
mInput.ShowDialog(owner)
Return mInput.ListBox1.SelectedItem.ToString
End Using
End Function
が、それは私が[列挙] .parse直接列挙型に、発信者の私はそこにアクセスすることができますので、実行された後、私は、このマニュアルのステップを排除したいと思います。
私は同じ列挙型を返すか、私が受け取ると、この機能でそれを投げたが、この行を許可していないようだと、少なくともバック値に解析を行うことができるようにしたいと思います。 オブジェクトとしてDIM結果= [列挙] .Parse(メソッドGetType(sampleValue)、mInput.ListBox1.SelectedItem.ToString、TRUE)
これはsampleValueがタイプではないと言います。だから... ...どのように私はsampleValueのタイプが解析するのですか?
または容易と総称各列挙するためのマッピング関数をコーディングすることなく、手列挙値を選択することをユーザに可能にする別の方法はありますか?
解決
最初の最小の質問に答えるために、あなたはすでにあなたの関数の1行目にやっているだけのように、sampleValue.GetType()を呼び出すことによって、オブジェクトのタイプを取得します。メソッドGetTypeは、キーワードとオブジェクトクラスのメソッドの両方である - 最初のタイプ(ややtautologically)の種類を取得し、第二には、オブジェクト・インスタンスのタイプを取得
。より大きな問題として、私はパラメータにもう少しリラックスした制約を持つジェネリックメソッドを使用することをお勧めします:それはどのような構造だけでなく、列挙型を受け入れましょう。あなたは、型の安全性の少しを失うが、私はそれはOKトレードオフだと思うだろう。誰かが非列挙型構造に合格した場合、あなたが、関数の外にゴミを取得したい。
好きではないですので、彼らは、実行時にArgumentExceptionがになるだろうPublic Function getEnumSelection(Of T As Structure)(ByVal owner As Windows.Forms.IWin32Window, ByVal subtitle As String) As T
Dim names As String() = [Enum].GetNames(GetType(T))
Using mInput As New dlgList
mInput.ListBox1.Items.Clear()
For Each name As String In names
mInput.ListBox1.Items.Add(name)
Next
mInput.ShowDialog(owner)
Return DirectCast([Enum].Parse(GetType(T), mInput.ListBox1.SelectedItem.ToString), T)
End Using
End Function