[英]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.