我需要一个函数将类型从第三方库转换为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
此类类型或字典。
随着类型的添加,此功能将不断增长(呃)。它不是类型安全的(需要包罗万象的模式)。弄清楚支持哪些类型需要仔细阅读整体模式匹配。
我很想能够做到这一点:
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
所以,我在这里寻找创意。有没有更好的方法来写这个来解决我的抱怨?