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"
我正在寻找一个现有的解决方案来序列化记录以查询字符串,但一无所获。我知道 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"