【发布时间】:2016-07-06 00:25:50
【问题描述】:
通过一些 API,我可以访问一系列 Gereric.Dictionary 形式的表格。因为该表有一个模式,所以我想从中提取记录。这是我有的?
open System.Collections.Generic
let gd = Dictionary<string,obj> ()
gd.Add("name", "Frank")
gd.Add("age", 24)
gd.Add("born", 1999)
type Person = { name : string
age : int}
let extractPerson (gd:Dictionary<string,obj>) =
{ name = gd.["name"] :?> string
age = gd.["age"] :?> int}
我可以让函数extractPerson 更通用,比如
let extract<'T> (gd:Dictionary<string,obj>) =
// ???
这样我就可以打电话了?
extract<Person> gd
【问题讨论】:
-
extract<'T>如何工作?您是否有一种方法可以使用字典中的每个键在记录上设置同名属性? -
是的,只需用字典中的匹配键填充记录
-
F# 是静态类型的,因此您将不得不使用反射或DLR 之类的东西。如果您在编译时知道密钥列表,则可以查看代码生成或类型提供程序(但我怀疑是否有一个开箱即用的)。
-
在我看来并不容易。假设
'T必须是一个记录,我会尝试通过反射通过'T中的所有字段来解决它,从你的字典中读出字段,将它们收集在一个对象数组中,然后你必须调用记录构造函数。如果您的'T具有可设置的属性,事情会变得更容易。
标签: f#