2009-02-04 89 views
0

我想做一個函數,可以採取枚舉類型,顯示所有可能的選擇給用戶,讓他們選擇一個,然後將其傳回。泛型不允許你限制枚舉。我有代碼工作會來回轉換,但我希望它接受並返回相同的枚舉類型。抽象枚舉選擇框

此代碼的工作,但沒有得到很好的,因爲我想:

公共功能getEnumSelection(BYVAL所有者Windows.Forms.IWin32Window,BYVAL sampleValue爲[枚舉],字幕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 

它運行後,我可以[枚舉] .parse直接調用者的枚舉類型,因爲我有權訪問它,但我想消除這個手動步驟。

我希望能夠返回相同的枚舉類型,或者至少將分析返回到我接收到的值並將其轉換爲此函數但它似乎不允許此行。 Dim result As Object = [Enum] .Parse(GetType(sampleValue),mInput.ListBox1.SelectedItem.ToString,True)

它說sampleValue不是一個類型。所以...我如何獲得sampleValue的類型來解析?

或者是否有另一種方法可以輕鬆地和一般地允許用戶選擇一個枚舉值,而無需爲每個枚舉手動編寫映射函數?

回答

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 
+0

我用下面的喜歡它改變 返回DirectCast([枚舉] .Parse(的GetType(T),mInput.ListBox1.SelectedItem.ToString),T) 和 公共功能getEnumSelection(效應的T作爲結構)(BYVAL所有者作爲Windows.Forms.IWin32Window,ByVal字幕作爲字符串)作爲T – Maslow 2009-02-11 12:26:59