简体   繁体   English

F#:记录查询字符串

[英]F#: record to query string

I'm searching for an existing solution to serialize records to query strings but found nothing. 我正在寻找一个现有的解决方案来序列化记录以查询字符串,但一无所获。 I know about F#'s pretty printing, but I have no idea how to access it manually. 我知道F#的漂亮打印效果,但是我不知道如何手动访问它。

In common I want something like this: 总的来说,我想要这样的东西:

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

where 哪里

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

I don't think such a function exists, but you can write one that uses 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 "&"

Since it uses Reflection, it's not as efficient as specialised functions that know about the types in advance, so whether or not this is sufficient for your needs, only you know. 由于它使用反射,因此它不像专门了解类型的专用功能那样高效,因此只有您自己知道,这是否足以满足您的需求。

It produces the desired result, though: 但是,它可以产生所需的结果:

> 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"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM