我正在尝试创建一个可以采用枚举类型的函数,向用户显示所有可能的选择,让他们选择一个,然后将其传回。泛型不允许您限制枚举。我有代码工作,会来回转换,但我希望它接受并返回相同的枚举类型。
此代码有效但不如我想的那样:
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直接调用到枚举类型,因为我可以访问它,但我想取消这个手动步骤。
我希望能够返回相同的枚举类型,或者至少将解析回到我收到的值并将其转换为此函数,但它似乎不允许这一行。 昏暗的结果As Object = [Enum] .Parse(GetType(sampleValue),mInput.ListBox1.SelectedItem.ToString,True)
它表示sampleValue不是一种类型。那么......我如何获得要解析的sampleValue类型?
还是有另一种方法可以轻松地,一般地允许用户选择枚举值而无需为每个枚举手动编码映射函数吗?
答案 0 :(得分:1)
要首先回答最小的问题,您可以通过调用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