簡體   English   中英

如何在F#中將任何記錄轉換為地圖/詞典?

[英]How convert any record into a map/dictionary in F#?

我需要將任意記錄序列化為地圖/字典。

我想象我的結束類型看起來像這樣:

type TabularData= array<Map<string, obj>>

但是我在構建通用函數時遇到問題,該函數可以接受任何記錄並將其轉換為Map。

實際上,最好的建議可能是使用一些現有的序列化庫,例如FsPickler 但是,如果您真的想為記錄編寫自己的序列化,則可以使用GetRecordFields (如注釋中所述)。

以下記錄並創建從string字段名稱到字段的obj值的映射。 請注意,它不處理嵌套記錄,並且它不是特別快:

open Microsoft.FSharp.Reflection

let asMap (recd:'T) = 
  [ for p in FSharpType.GetRecordFields(typeof<'T>) ->
      p.Name, p.GetValue(recd) ]
  |> Map.ofSeq

這是一個使用簡單記錄調用此示例的小示例:

type Person =
  { Name : string 
    Age : int }

asMap { Name = "Tomas"; Age = -1 }

使用Tomas提到的相同想法,可以從如下記錄中創建IDictionary<K,V>

let asDictionary (entity: 'T) =
    seq {
        for prop in FSharpType.GetRecordFields(typeof<'T>) -> 
        prop.Name, prop.GetValue(entity)
    } |> dict

暫無
暫無

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

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