我正在与一个旧的api打架,我遇到了以下问题:当我尝试将一个Object转换为一个Object数组时,当值为可以为空的日期时,我得到运行时异常。
Module Module1
Sub Main()
Console.WriteLine(Misc.dateCast(New Nullable(Of DateTime)()))
Console.WriteLine(Misc.tabledateCast(New Nullable(Of DateTime)() {New DateTime()}))
End Sub
End Module
Module Misc
Function dateCast(ByVal val As Nullable(Of DateTime)) As Object
Return CType(val, Object)
End Function
Function tabledateCast(ByVal val As Object) As Object()
Return CType(val, IEnumerable(Of Object)).Cast(Of Object).ToArray
End Function
End Module
第一个演员正在工作,但不是第二个。如何成功投射到一个对象数组?
我无法使用CType(val, IEnumerable(Of Nullable(Of DateTime)))
,因为该函数可能会获得其他类型的数组。
答案 0 :(得分:2)
看起来你有两个选择:
1)如果数组本身是类型安全的,你可以对方法进行泛化,以便它在转换为对象之前知道要转换的内容 - 不是最好看的代码,特别是在VB.NET中:
Module Module1
Sub Main()
Console.WriteLine(Misc.tabledateCast(Of Nullable(Of DateTime))(New Nullable(Of DateTime)() {New DateTime()}))
End Sub
End Module
Module Misc
Function tabledateCast(Of T)(ByVal val As Object) As Object()
Return CType(val, IEnumerable(Of T)).Cast(Of Object).ToArray
End Function
End Module
2)Laoujin的链接,你首先进行非通用的IEnumerable
演员:
Module Module1
Sub Main()
Console.WriteLine(Misc.tabledateCast(New Nullable(Of DateTime)() {New DateTime()}))
End Sub
End Module
Module Misc
Function tabledateCast(ByVal val As Object) As Object()
Return CType(val, IEnumerable).Cast(Of Object).ToArray
End Function
End Module