F#:记录查询字符串

F#: record to query string

我正在寻找一个现有的解决方案来序列化记录以查询字符串,但一无所获。我知道 F# 的漂亮打印,但我不知道如何手动访问它。

通常我想要这样的东西:

type Person = {first:string; last:string}
type Group = {name:string; size:int}

let person = {first="Mary"; last="Smith"}
let personQueryString = Something.toQueryString person

let group = {name="Full"; size=345}
let groupQueryString = Something.toQueryString group

哪里

personQueryString -> "first=Mary&last=Smith"
groupQueryString -> "name=Full&size=345"

我认为不存在这样的函数,但您可以编写一个使用反射的函数:

open System.Reflection

module Something =
    let toQueryString x =
        let formatElement (pi : PropertyInfo) =
            sprintf "%s=%O" pi.Name <| pi.GetValue x
        x.GetType().GetProperties()
        |> Array.map formatElement
        |> String.concat "&"

由于使用了反射,效率不如事先知道类型的专用函数,所以这是否足以满足您的需求,只有您自己知道。

它产生了预期的结果,但是:

> let person = {first="Mary"; last="Smith"};;

val person : Person = {first = "Mary";
                       last = "Smith";}

> let personQueryString = Something.toQueryString person;;

val personQueryString : string = "first=Mary&last=Smith"

> let group = {name="Full"; size=345};;

val group : Group = {name = "Full";
                     size = 345;}

> let groupQueryString = Something.toQueryString group;;

val groupQueryString : string = "name=Full&size=345"