3

私は現在、古い API と戦っていて、次の問題に直面しています: 値が null 可能な日付の場合に、オブジェクトをオブジェクトの配列にキャストしようとすると、実行時例外が発生します。

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

最初のキャストは機能しますが、2 番目のキャストは機能しません。オブジェクトの配列に正常にキャストする方法は?

CType(val, IEnumerable(Of Nullable(Of DateTime)))関数が他の型の配列を取得する可能性があるため、使用できません。

4

1 に答える 1

2

次の 2 つの選択肢があるようです。

1) 配列自体がタイプ セーフである場合は、オブジェクトにキャストする前にキャスト先を認識できるようにメソッドをジェネリック化できます。

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) 最初に非ジェネリックIEnumerableキャストを行う Laoujin のリンク:

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
于 2012-09-14T16:07:51.013 に答える