タイプをサードパーティのライブラリからIDictionary
s に変換して、簡単に (JSON に) シリアル化できるようにする関数が必要です。型間に依存関係があるため、辞書がネストされることがあります。
今、私はこのような恐ろしいものを持っています:
//Example type
type A(name) =
member __.Name = name
//Example type
type B(name, alist) =
member __.Name = name
member __.AList : A list = alist
let rec ToSerializable x =
match box x with
| :? A as a -> dict ["Name", box a.Name]
| :? B as b -> dict ["Name", box b.Name; "AList", box (List.map ToSerializable b.AList)]
| _ -> failwith "wrong type"
これにより、すべてがプリミティブ型、そのIEnumerable
ような型、または辞書に変換されます。
この関数は、型が追加されるにつれて成長し続けます (ug)。タイプ セーフではありません (キャッチオール パターンが必要です)。どのタイプがサポートされているかを理解するには、モノリシック パターン マッチを熟読する必要があります。
これができるようになりたいです:
type ThirdPartyType with
member x.ToSerializable() = ...
let inline toSerializable x =
(^T : (member ToSerializable : unit -> IDictionary<string,obj>) x)
let x = ThirdPartyType() |> toSerializable //type extensions don't satisfy static member constraints
だから、私はここで創造性を探しています。私の苦情に対処するこれを書くより良い方法はありますか?