有没有办法可以通过使用string
中表示的名称来访问type属性。有点像:
type B = {FirstName:string; LastName:string}
let b = { FirstName="Bob"; LastName="Smith" }
b.``"FirstName"``
原因是我想根据基于xml
的地图动态访问该类型。
答案 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#代码中的常规字段名称。
类型提供程序适用于脚本编写和探索性编程,因为它们可以节省您必须声明和更新类型定义的时间。但是,在构建更持久的应用程序时,您可能会发现使用显式定义的类型作为表示是可取的。