3

さまざまな種類のテストを実行するプログラムがあります。各テストには、設定可能なさまざまな設定があります。各テストで使用された設定をExcelファイルにエクスポートしようとしています。設定の値はさまざまなタイプ(Double、Integer、String、Boolean)である可能性があるため、今すぐ書き込みます。すべての設定がDictionary(Of String、Object)に格納されています。そのように辞書から値を再キャストしようとしていますが、DirectCastはtが好きではなく、タイプtが定義されていないと表示されます。CTypeも試しましたが、うまくいかないようです。設定のタイプはDictionary(Of String、Object)です。

Private Sub writeTestSettings(ByRef book As HSSFWorkbook, ByVal settings As Dictionary(Of String, Object))
    Dim settingsSheet As HSSFSheet = book.CreateSheet("Test Configuration")

    Dim i As Integer = 0
    For Each key In settings.Keys
        Dim row = settingsSheet.CreateRow(i)
        Dim cell1 As HSSFCell = row.CreateCell(0)
        cell1.SetCellValue(key)
        Dim cell2 As HSSFCell = row.CreateCell(1)
        Dim value As Object = settings(key)
        Dim t As Type = value.GetType()
        cell2.SetCellValue(DirectCast(value, t))

    Next
End Sub
4

2 に答える 2

1

.NET 4.0以降を使用している場合は、代わりにCTypeDynamicを使用できます。この質問も参照してください。

    Dim t As Type = value.GetType()
    cell2.SetCellValue(CTypeDynamic(value, t))

また、設定のストレージメカニズムを少し変更することを検討することもできます。オブジェクトのディクショナリにいくつかの異なるタイプを入れると、将来のメンテナンスとデバッグが不快になる可能性があります。カフから外れたアイデアとして、1つの可能性は、プライベートタイプ固有のディクショナリとオーバーロードされたアクセサおよびミューテータを備えた単純なラッパークラスです。

于 2012-11-13T20:12:01.773 に答える
0

コンパイル時にタイプがわからないため、直接キャストすることはできません。これはあまりクリーンなコードではありませんが、SelectCaseを使用して実行できます。

Select Case t
    Case GetType(Double)
        Dim doubleValue = CType(value, Double)
        cell2.SetCellValue(doubleValue)
    Case GetType(Integer)
        Dim integerValue = CType(value, Integer)
        cell2.SetCellValue(integerValue)
    ...
End Select
于 2012-11-13T20:10:29.593 に答える