Вопрос

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

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

Открытая функция getEnumSelection (владелец ByVal как Windows.Forms.IWin32Window, ByVal sampleValue As [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].парсить вызывающую сторону непосредственно к типу перечисления, поскольку у меня есть к нему доступ, но я бы хотел исключить этот ручной шаг.

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

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

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

Это было полезно?

Решение

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

Что касается более широкого вопроса, я бы предложил использовать общий метод с немного более расслабленным ограничением параметров:пусть он принимает любую структуру, а не только перечисления.Вы немного теряете типобезопасность, но я считаю, что это приемлемый компромисс.Если кто-то передаст структуру, не являющуюся перечислением, он получит исключение 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top