首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将任何记录转换为F#中的映射/字典?

如何将任何记录转换为F#中的映射/字典?
EN

Stack Overflow用户
提问于 2015-06-17 15:13:33
回答 2查看 1.3K关注 0票数 2

我需要将任意记录序列化为映射/字典。

我想我的终结者是这样的:

代码语言:javascript
运行
复制
type TabularData= array<Map<string, obj>>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 15:49:37

在实践中,最好的建议可能是使用一些现有的序列化库,比如FsPickler。但是,如果您真的想为记录编写自己的序列化,那么GetRecordFields (如注释中所提到的)是最好的选择。

下面是一个记录,并创建一个从string字段名到字段的obj值的映射。请注意,它不处理嵌套记录,而且速度也不是特别快:

代码语言:javascript
运行
复制
open Microsoft.FSharp.Reflection

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

下面是一个用一个简单的记录来调用它的小例子:

代码语言:javascript
运行
复制
type Person =
  { Name : string 
    Age : int }

asMap { Name = "Tomas"; Age = -1 }
票数 10
EN

Stack Overflow用户

发布于 2016-07-04 12:35:13

使用Tomas提到的相同想法,您可以从这样的记录创建一个IDictionary<K,V>

代码语言:javascript
运行
复制
let asDictionary (entity: 'T) =
    seq {
        for prop in FSharpType.GetRecordFields(typeof<'T>) -> 
        prop.Name, prop.GetValue(entity)
    } |> dict
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30895624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档