如何将任何记录转换为F#中的地图/字典?

mam*_*mcx 0 f# dictionary record converter

我需要将任意记录序列化为地图/字典.

我想我的最终类型看起来像这样:

type TabularData= array<Map<string, obj>>
Run Code Online (Sandbox Code Playgroud)

但是我在构建一个接受任何记录并将它们转换为Map 的泛型函数时遇到了问题.

Tom*_*cek 6

在实践中,最好的建议可能是使用一些现有的序列化库,如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
Run Code Online (Sandbox Code Playgroud)

这是一个用简单记录调用它的小例子:

type Person =
  { Name : string 
    Age : int }

asMap { Name = "Tomas"; Age = -1 }
Run Code Online (Sandbox Code Playgroud)