Jac*_*iak 3 f# f#-interactive f#-3.0
有没有什么办法可以通过使用string. 类似的东西:
type B = {FirstName:string; LastName:string}
let b = { FirstName="Bob"; LastName="Smith" }
b.``"FirstName"``
Run Code Online (Sandbox Code Playgroud)
原因是我想根据xml基于地图动态访问类型。
这是你可以通过反射来做的事情。除了通用的 .NET 反射 API 之外,F# 还带有一个小型反射库Microsoft.FSharp.Reflection,它提供了一些用于构造和分解基本 F# 类型(如记录)的实用函数。
您可以PropertyInfos使用以下方法获取所有记录字段:
FSharpType.GetRecordFields(typeof<B>)
Run Code Online (Sandbox Code Playgroud)
然后,您可以将记录分解为一组值并将它们放回记录中,如下所示:
let fields = FSharpValue.GetRecordFields(b)
let b' = FSharpValue.MakeRecord(typeof<B>, fields) :?> B
Run Code Online (Sandbox Code Playgroud)
您可以在此基础上构建自己的持久性库,但这在很大程度上是一个已解决的问题。我认为 Json.NET 现在应该处理开箱即用的序列化记录,当然也有一个 xml 等效项。
F# 还以类型提供程序的形式提供了一种独特的替代方案。如果您希望您的 xmls“驱动”您的类型的外观 - 特别是当您访问通过 xml 通信的外部源时 - 您可能需要查看FSharp.Data和XmlProvider. 它们与您在示例中所做的非常相似 - 您将类型提供程序指向 xml 示例,并在编译期间生成与 xml 结构相对应的类型。因此,您可以在 F# 代码中以静态类型方式将 xml 节点名称用作常规字段名称。
类型提供程序适用于脚本编写和探索性编程,因为它们可以节省您必须声明和更新类型定义的时间。但是在构建更持久的应用程序时,您可能会发现使用明确定义的类型作为表示是可取的。