2008-10-30 2 views
14

유형을 런타임에만 알 수있는 곳에서는 동적으로 값을 캐스팅 할 수 있기를 원합니다. 이런 식으로 뭔가 :VB.NET에서의 캐스팅

myvalue = CType(value, "String, Integer or Boolean") 

인수로 전달되는 유형의 값을 포함하고 또한 데이터베이스에서 읽기, 값이 데이터베이스에 문자열로 저장되는 문자열.

이것이 가능합니까?

답변

7

물론 myvalueObject 유형으로 정의해야하며 반드시 그런 것은 아닙니다. 아마도 이것은 일반적인 제네릭에 의해 제공되는 경우입니다.

어떤 유형을 사용할 지 결정하는 요소는 무엇입니까?

+0

유형 "문자열", "정수", "부울"을 나타내는 문자열 – Youssef

+0

문자열을 설정하는 것은 무엇입니까? –

+0

문자열은 인수 – Youssef

4

글쎄, 어떤 유형이 필요한지 어떻게 결정합니까? Joel이 말한 것처럼, 이것은 아마도 generics의 경우 일 것입니다. 것은 : 컴파일 타임에 타입을 알지 못하기 때문에 반환 된 값을 처리 할 수 ​​없으므로 여기서는 캐스트가 실제로 이해가되지 않습니다.

2

아마도 뭔가를 동적으로 캐스팅하는 대신 (작동하지 않는 것처럼) 리플렉션을 대신 사용할 수 있습니다. 특정 메서드 나 속성을 가져오고 호출하기는 쉽습니다.

Dim t As Type = testObject.GetType() 
Dim prop As PropertyInfo = t.GetProperty("propertyName") 
Dim gmi As MethodInfo = prop.GetGetMethod() 
gmi.Invoke(testObject, Nothing) 

귀엽지는 않지만 너무 많은 대신 한 줄로 그 중 일부를 할 수 있습니다.

5

이렇게하는 것이 가장 짧은 방법입니다. 여러 유형으로 테스트했습니다.

Sub DoCast(ByVal something As Object) 

    Dim newSomething = Convert.ChangeType(something, something.GetType()) 

End Sub 
9
Dim bMyValue As Boolean 
Dim iMyValue As Integer 
Dim sMyValue As String 
Dim t As Type = myValue.GetType 


Select Case t.Name 
    Case "String" 
     sMyValue = ctype(myValue, string) 
    Case "Boolean" 
     bMyValue = ctype(myValue, boolean) 
    Case "Integer" 
     iMyValue = ctype(myValue, Integer) 
End Select 

그것은 조금 해키하지만 작동합니다.