将对象强制转换为具有可空日期的Object()

时间:2012-09-14 15:14:48

标签: vb.net casting

我正在与一个旧的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))),因为该函数可能会获得其他类型的数组。

1 个答案:

答案 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