2016-04-24 6 views
2

レコードをクエリ文字列にシリアル化するための既存のソリューションを探していますが、何も見つかりませんでした。私はF#のきれいな印刷について知っていますが、私はそれを手動でどのようにアクセスするのか分かりません。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" 
+1

? –

答えて

6

を:

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

Reflectionを使用しているため、事前に型を知っている特殊な関数ほど効率的ではありませんそれがあなたのニーズに十分であるかどうかに関わらず、あなただけが知っています。

これは、しかし、所望の結果を生成する:反射を利用

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

ありがとう、マーク。美しい。私はそれをテストします。 –