2013-06-06 2 views
1

VB.NET (프레임 워크 3.5)에서 시도하고 있습니다. Nothing 값을 가진 Nullable 속성의 형식을 얻으려면 (기본값), 방법을 알고 있어야합니다. CType을 만드십시오.Nothing 값을 가진 Nullable 속성의 형식을 가져옵니다.

Class DinamicAsign 
Public Property prop As Integer? 
Public Property prop2 As Date? 

Public Sub New() 
    Asign(prop, "1") 
    Asign(prop2, "28/05/2013") 
End Sub 

Public Sub Asign(ByRef container As Object, value As String) 
    If (TypeOf (container) Is Nullable(Of Integer)) Then 
     container = CType(value, Integer) 
    ElseIf (TypeOf (container) Is Nullable(Of Date)) Then 
     container = CType(value, Date) 
    End If 
End Sub 
End Class 

이 코드는 제대로 작동하지 않습니다 코드는 다음과 같은 것이다. 문제는 "컨테이너"의 유형을 아는 것입니다.

If (TypeOf(contenedor) is Integer) then... 
If (contenedor.GetType() is Integer) then... 

을하지만 값이 아무것도없는 경우 어떻게 유형을 구하는 아무 생각이 :

"소품"경우

는 ("소품"아무것도하지 않습니다)이 코드가 작동하는 가치가있다. 나는이 방법을 시도했지만 작동하지 않습니다

container.GetType() 

TypeOf (contenedor) is Integer 

TypeOf (contenedor) is Nullable(of Integer) 

내가 아는 사람이 할 수 응답 개체를 참조하지 않고 당신이 유형을 알 수 없기 때문에 "컨테이너"아무것도 없다. 캐스트를 만들기 위해 오버로드 기능을 만들어,이 방법 : :하지만이 내가이 문제를 해결하기 위해 트릭을 발견하기 때문에 잘못된 것 같다

Class DinamicAsign2 
Public Property prop As Integer? 
Public Property prop2 As Date? 

Public Sub New() 
    Asignar(prop, "1") 
    Asignar(prop2, "28/05/2013") 
End Sub 

Public Sub Asignar(ByRef container As Object, value As String) 
    AsignAux(container, value) 
End Sub 

Public Sub AsignAux(ByRef container As Integer, value As String) 
    container = CType(value, Integer) 
End Sub 

Public Sub AsignAux(ByRef container As Decimal, value As String) 
    container = CType(value, Decimal) 
End Sub 
End Class 

"컨테이너"정수인 경우는

public function AsignAux(byref container as Integer, value as string) 
에 호출

그리고 "컨테이너"이면이 잘 작동

public function AsignAux(byref container as Date, value as string) 

, .NET 어쨌든 객체의 유형을 알고에 전화가 과부하 기능을 수정하기 때문에 날짜 호출합니다. 그래서 .NET이하는 것처럼 아무 값도없는 nullable Object Type을 결정하는 방법을 찾고 싶습니다..

들으 Nullable(Of T)Object가되면

답변

3

이 유형의 데이터가 손실되어 그 중 하나는 평범한 구식 Nothing되고, 또는 유형은, 예를 들어냅니다 Integer. 이 작업을 수행하려면 귀하의 방법을 변경 할 수 있습니다

Public Sub Asign(Of T As Structure)(ByRef container As Nullable(Of T), value As String) 
    ' T is Integer or Date, in your examples 
    container = System.Convert.ChangeType(value, GetType(T)) 
End Sub 

그렇지 않다면, 당신은 다른 유형을 기록해야하고, 당신의 방법에 그 정보를 전달하겠습니다.

복싱/언 박싱이 이런 식으로 작동하는 이유에 대한 정보는 Boxing/Unboxing Nullable Types - Why this implementation?을 참조하십시오. 간단히 말해 null 입력 가능 유형을 Object으로 사용하는 것이 가장 현명한 방법입니다.

+0

완벽한 솔루션, 아주 많이! 어쨌든, 내가 이전 코드에서 말했듯이, 과부하 함수를 사용하면 .NET이 객체 매개 변수의 유형에 따라 어떤 함수를 호출하는지 알기 때문에 객체 매개 변수를 사용할 때 유형이 손실되지 않는다고 생각합니다 (예 : nullable 속성의 유형) – CarlosTI

+0

재미있는 점은, VB 컴파일러 나 런타임은 C# (더 익숙한 것)이하지 않는다는 것인데, 이는 DinamicAsign2에서 코드가 작동하는 것을 허용합니다. Nullable 제쳐두고, C#에서 당신이 C#에서'Object'를 가지고 있고 그런 식으로'AsignAux'를 호출하려고한다면, 그것은 해결되지 않을 것입니다. –

+0

'Nothing' 인'Nullable (Of Integer) '값을'Object' 변수에 넣으면 디버거에'Integer'와 같은 타입을 볼 수 있습니까? 개체'? C#에서는 그렇게하지 않을 것입니다. 그러나,'int?'C에서 실제 int 값을 갖고 그것을 객체에 저장하면 단순히 int가됩니다 (더 이상 int가 아닙니다). –

관련 문제