2009-02-04 2 views
0

열거 형을 사용하고 가능한 모든 선택을 사용자에게 표시하고 하나를 선택한 다음 다시 전달할 수있는 함수를 만들려고합니다. Generics는 enum으로 제한하지 않습니다. 앞뒤로 캐스팅 할 코드가 있지만 동일한 열거 형을 받아 들여 반환하고 싶습니다.초록 열거 형 선택 상자

이 코드는 내가 원하는만큼 있지만뿐만 아니라 작동 : 문자열

으로

공공 기능 getEnumSelection (Windows.Forms.IWin32Window, ByVal의 sampleValue [열거 바와 같이, 문자열로 ByVal의 자막으로 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를 열거 형에 직접 연결할 수 있으므로이 수동 단계를 제거하고 싶습니다.

동일한 열거 형을 반환하거나이 함수에서받은 값으로 파싱을 다시 수행 할 수는 있지만이 행을 허용하지 않는 것 같습니다. Dim result As Object = [열거 형] .Parse (GetType (sampleValue), mInput.ListBox1.SelectedItem.ToString, True)

이는 sampleValue가 형식이 아님을 나타냅니다. 그래서 ... 어떻게 sampleValue의 타입을 파싱 할 것인가?

또는 열거 형마다 매핑 기능을 손으로 코딩하지 않고도 사용자가 쉽게 enum 값을 선택할 수있는 또 다른 방법이 있습니까?

답변

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 소유자 As Windows.Forms.IWin32Window, 문자열로 ByVal 자막) T – Maslow

+0

예, 죄송합니다, 그건 내가 의미했던 것이 었습니다 - 부주의 한 복사 - 내 부분에 붙여 넣기. 나는 그 지위를 편집 할 것이다. –