这与我之前关于以类型安全的方式扩展第三方类型的问题有关。有一些很好的答案,但它们依赖于编译时已知的具体类型。我不能依赖这个。有时类型是盒装的。有没有办法扩展第三方类型来模拟动态调度?
我会为我自己的库使用一个接口。例如:
type ICanSerialize =
abstract ToSerializable : unit -> IDictionary<string,obj>
type B(items: obj[]) =
interface ICanSerialize with
member __.ToSerializable() =
dict ["Items", items |> Array.map (fun x ->
(x :?> ICanSerialize).ToSerializable()) |> box]
作为旁注,如果我们可以这样做会很好:
let inline toSerializable x =
(^T : (member ToSerializable : unit -> IDictionary<string,obj>) x)
let x = obj()
let d = toSerializable (unbox x)
但显然不可能将运行时强制转换和内联结合起来。