簡體   English   中英

如何從VB.Net中的Dictionary(Of String,Object)重鑄對象

[英]How to recast objects from a Dictionary(Of String, Object) in VB.Net

我有一個程序運行一堆不同類型的測試。 每個測試都有一堆可以設置的不同設置。 我正在嘗試將用於每個測試的設置導出到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

如果您使用的是.NET 4.0或更高版本,則可以使用CTypeDynamic 另見這個問題

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

您可能還需要考慮稍微更改設置的存儲機制。 將幾種不同類型放在對象字典中可能會使將來的維護和調試變得令人討厭。 作為一個關於袖口的想法,一種可能性是一個簡單的包裝類,它具有私有類型特定的字典和重載的訪問器和變換器。

您無法直接轉換,因為您在編譯時不知道類型。 它不是很干凈的代碼,但您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM