F#:记录查询字符串

Rom*_*hin 2 serialization f# 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
Run Code Online (Sandbox Code Playgroud)

哪里

personQueryString -> "first=Mary&last=Smith"
groupQueryString -> "name=Full&size=345"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 6

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

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 "&"
Run Code Online (Sandbox Code Playgroud)

因为它使用反射,所以它不如提前知道类型的专用函数那么高效,所以只要你知道这是否足以满足你的需求.

但它会产生所需的结果:

> 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"
Run Code Online (Sandbox Code Playgroud)