.net 抽象枚举选择框

.net 抽象枚举选择框,.net,vb.net,enums,abstraction,.net,Vb.net,Enums,Abstraction,我正在尝试创建一个函数,该函数可以采用枚举类型,向用户显示所有可能的选择,让用户选择一个,然后将其传回。泛型不允许您限制为枚举。我已经有了可以来回转换的代码,但我希望它接受并返回相同的枚举类型 此代码工作正常,但不如我希望的那样好: 公共函数getEnumSelection(ByVal所有者为Windows.Forms.IWin32Window,ByVal sampleValue为[Enum],ByVal字幕为String)为String Dim names As String() =

我正在尝试创建一个函数,该函数可以采用枚举类型,向用户显示所有可能的选择,让用户选择一个,然后将其传回。泛型不允许您限制为枚举。我已经有了可以来回转换的代码,但我希望它接受并返回相同的枚举类型

此代码工作正常,但不如我希望的那样好:

公共函数getEnumSelection(ByVal所有者为Windows.Forms.IWin32Window,ByVal sampleValue为[Enum],ByVal字幕为String)为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]。直接将调用方解析为Enum类型,因为我可以在那里访问它,但我想取消此手动步骤

我希望能够返回相同的枚举类型,或者至少在这个函数中接收并强制转换时解析回一个值,但它似乎不允许这一行。 Dim结果为Object=[Enum].Parse(GetType(sampleValue),mInput.ListBox1.SelectedItem.ToString,True)

它说sampleValue不是一种类型。所以如何获取要分析的sampleValue的类型


或者,是否有另一种方法可以方便且通用地允许用户选择枚举值,而无需为每个枚举手工编写映射函数?

要首先回答最小的问题,您可以通过调用sampleValue.GetType()来获取对象的类型,就像您在函数的第一行中所做的那样。GetType既是一个关键字,也是对象类的一个方法——第一个获取类型的类型(有些重复),第二个获取对象实例的类型

至于更大的问题,我建议使用对参数的约束稍微宽松一些的通用方法:让它接受任何结构,而不仅仅是枚举。您失去了一点类型安全性,但我认为这是一个不错的权衡。如果有人传入一个非枚举结构,他们会在运行时得到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

我喜欢它,因为以下更改将DirectCast([Enum].Parse(GetType(T)、mInput.ListBox1.SelectedItem.ToString)、T和公共函数getEnumSelection(T的结构)(ByVal所有者作为Windows.Forms.IWin32Window,ByVal字幕作为字符串)作为TYes返回,抱歉,这就是我的意思-我的意思-草率复制粘贴。我会编辑这篇文章。