0

列挙型を取り、可能なすべての選択をユーザーに表示し、ユーザーに選択させてから戻すことができる関数を作成しようとしています。ジェネリックでは、列挙型に制限することはできません。前後にキャストするコードが動作していますが、同じ列挙型を受け入れて返すようにしたいと考えています。

このコードは機能しますが、私が望むほどではありません:

Public Function getEnumSelection (ByVal owner As Windows.Forms.IWin32Window, ByVal sampleValue As [Enum], ByVal subtitle As String) As String

    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

実行後、呼び出し元で [Enum].parse を直接列挙型にアクセスできるため、列挙型に直接アクセスできますが、この手動の手順を排除したいと思います。

同じ列挙型を返すことができるようにしたい、または少なくともこの関数で受け取ってキャストしたときに値に解析を戻すことができるようにしたいのですが、この行は許可されていないようです。Dim result As Object = [Enum].Parse(GetType(sampleValue), mInput.ListBox1.SelectedItem.ToString, True)

sampleValue は型ではありません。では、解析する sampleValue の型を取得するにはどうすればよいでしょうか。

または、列挙型ごとにマッピング関数を手作業でコーディングせずに、ユーザーが列挙型の値を簡単かつ一般的に選択できるようにする別の方法はありますか?

4

1 に答える 1

1

最初に最小の質問に答えるには、関数の最初の行で既に行っているように、sampleValue.GetType() を呼び出してオブジェクトの型を取得します。GetType は、Object クラスのキーワードでありメソッドでもあります。最初のものは型の型を取得し (ややトートロジー的に)、2 番目のものはオブジェクト インスタンスの型を取得します。

より大きな質問については、パラメーターに対する制約を少し緩和した汎用メソッドを使用することをお勧めします。つまり、列挙型だけでなく、任意の構造を受け入れるようにします。型の安全性が少し失われますが、それは問題ないトレードオフだと思います。誰かが列挙型以外の構造を渡すと、実行時に 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
于 2009-02-04T20:57:30.027 に答える