3

我有一个程序可以运行一堆不同类型的测试。每个测试都有许多可以设置的不同设置。我正在尝试将用于每个测试的设置导出到 Excel 文件。现在写,我将所有设置都存储在 Dictionary(Of String, Object) 中,因为设置的值可以是不同的类型,即(Double、Integer、String、Boolean)。我正在尝试像这样重铸字典中的值,但 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))

您可能还需要考虑稍微更改设置的存储机制。将几种不同的类型放入对象字典中可能会使将来的维护和调试变得令人讨厌。作为一个即兴的想法,一种可能性是一个简单的包装类,它具有私有类型特定的字典和重载的访问器和修改器。

于 2012-11-13T20:12:01.773 回答
0

您不能直接转换,因为您在编译时不知道类型。这不是很干净的代码,但您可以使用 Select Case 来做到这一点:

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