f#type属性访问

时间:2016-09-10 17:48:51

标签: f# f#-interactive f#-3.0

有没有办法可以通过使用string中表示的名称来访问type属性。有点像:

type B = {FirstName:string; LastName:string} 
let b = { FirstName="Bob"; LastName="Smith" }  
b.``"FirstName"``

原因是我想根据基于xml的地图动态访问该类型。

1 个答案:

答案 0 :(得分:4)

这是你可以通过反思做的事情。除了通用的.NET反射API之外,F#还带有一个小的反射库Microsoft.FSharp.Reflection,它提供了一些实用函数,用于构造和分解基本的F#类型,如记录。

您可以使用以下方式获取所有记录字段的PropertyInfos

FSharpType.GetRecordFields(typeof<B>)

然后,您可以将记录分解为值数组,并将它们放回到这样的记录中:

let fields = FSharpValue.GetRecordFields(b)
let b' = FSharpValue.MakeRecord(typeof<B>, fields) :?> B

您可以在此基础上构建自己的持久性库,但这在很大程度上是一个已解决的问题。我认为Json.NET现在应该处理开箱即用的序列化记录,当然还有一个xml等价物。

F#还以类型提供者的形式提供了一种独特的替代方案。如果你想让你的xmls'&#34;驱动&#34;您的类型看起来如何 - 特别是如果您正在访问通过xml进行通信的外部源 - 您可能需要查看FSharp.Data and XmlProvider。它们为您在示例中所做的事情提供了非常相似的氛围 - 您将类型提供程序指向xml示例,并在编译期间生成与xml结构相对应的类型。因此,您可以以静态类型的方式将xml节点名称用作F#代码中的常规字段名称。

类型提供程序适用于脚本编写和探索性编程,因为它们可以节省您必须声明和更新类型定义的时间。但是,在构建更持久的应用程序时,您可能会发现使用显式定义的类型作为表示是可取的。