문제
나는 열거 형식을 취하고 가능한 모든 선택을 사용자에게 표시하고 하나를 선택한 다음 다시 전달할 수있는 함수를 만들려고 노력하고 있습니다. 제네릭은 열거로 제한 할 수 없습니다. 앞뒤로 캐스트 될 코드가 작동하지만 동일한 열거 유형을 수락하고 반환하기를 바랍니다.
이 코드는 작동하지만 원하는대로 작동하지 않습니다.
public function getEnumSelection (byval as as 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].
나는 동일한 열거 유형을 반환하거나 최소한이 함수에서 수신 할 때 값으로 다시 구문 분석을 할 수 있기를 원하지만이 라인을 허용하지 않는 것 같습니다. DIM 결과 Object = [enum] .parse (getType (sampleValue), minput.listbox1.SelectedItem.ToString, true)
SampleValue는 유형이 아니라고 말합니다. 그래서 ... 샘플 value 유형을 구문 분석하는 방법은 무엇입니까?
아니면 각 열거에 대한 매핑 함수를 손으로 코딩하지 않고 쉽고 일반적으로 열거 값을 선택할 수있는 또 다른 방법이 있습니까?
해결책
가장 작은 질문에 먼저 답변하려면 이미 기능의 첫 번째 줄에서 이미 수행하고있는 것처럼 SampleValue.getType ()를 호출하여 객체 유형을 얻습니다. gettype는 객체 클래스의 키워드이자 메소드입니다. 첫 번째는 유형의 유형을 (다소 팽창적으로) 가져오고 두 번째는 객체 인스턴스의 유형을 얻습니다.
더 큰 질문에 관해서는, 나는 매개 변수에 약간 더 편안한 제약 조건을 가진 일반적인 방법을 사용하는 것이 좋습니다. 당신은 약간의 유형 안전을 잃지 만, 나는 그것이 괜찮은 트레이드 오프라고 생각합니다. 누군가가 아닌 구조를 통과하면 런타임에 인수 외환을 얻을 수 있으므로 기능에서 쓰레기를 꺼내는 것과는 다릅니다.
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