Поле выбора абстрактного перечисления - PullRequest
0 голосов
/ 04 февраля 2009

Я пытаюсь создать функцию, которая может принимать тип enum, отображать все возможные варианты выбора для пользователя, позволить ему выбрать один и затем передать его обратно. Обобщения не позволяют ограничивать перечисление. У меня есть работающий код, который будет приводить туда и обратно, но я бы хотел, чтобы он принимал и возвращал тот же тип enum.

Этот код работает, но не так хорошо, как хотелось бы:

Открытая функция getEnumSelection (владелец ByVal как Windows.Forms.IWin32Window, ByVal sampleValue как [Enum], субтитр 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

После того, как он запустится, я могу [Enum] .parse на вызывающей стороне напрямую к типу enum, так как у меня есть к нему доступ, но я бы хотел исключить этот шаг вручную.

Я бы хотел иметь возможность возвращать тот же тип перечисления или, по крайней мере, выполнить синтаксический анализ значения, которое я получил, и привести его в этой функции, но, похоже, эта строка не разрешена. Затемнить результат как Object = [Enum] .Parse (GetType (sampleValue), mInput.ListBox1.SelectedItem.ToString, True)

В нем указано, что sampleValue не является типом. Итак ... как мне получить тип sampleValue для анализа?

Или есть другой способ, позволяющий легко и вообще разрешить пользователю выбирать значение перечисления без ручного кодирования функции отображения для каждого перечисления?

1 Ответ

1 голос
/ 04 февраля 2009

Чтобы сначала ответить на самый маленький вопрос, вы получите тип объекта, вызвав sampleValue.GetType (), как вы это уже делали в первой строке своей функции. GetType является и ключевым словом, и методом класса Object - первый получает тип типа (несколько тавтологически), а второй получает тип экземпляра объекта.

Что касается более крупного вопроса, я бы предложил использовать универсальный метод с чуть более смягченным ограничением параметров: пусть он принимает любую структуру, а не только перечисления. Вы теряете немного безопасности типов, но я думаю, что это хороший компромисс. Если кто-то передает структуру, отличную от enum, он получит исключение 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
...