F# 第三方类型的动态调度

F# 第三方类型的动态调度,f#,dynamic-dispatch,F#,Dynamic Dispatch,这与我关于以类型安全的方式扩展第三方类型的讨论有关。有一些很好的答案,但它们依赖于编译时已知的具体类型。我不能相信这一点。有时字体是盒装的。有没有办法扩展第三方类型来模拟动态调度 我会为我自己的库使用一个接口。例如: type ICanSerialize = abstract ToSerializable : unit -> IDictionary<string,obj> type B(items: obj[]) = interface ICanSerialize w

这与我关于以类型安全的方式扩展第三方类型的讨论有关。有一些很好的答案,但它们依赖于编译时已知的具体类型。我不能相信这一点。有时字体是盒装的。有没有办法扩展第三方类型来模拟动态调度

我会为我自己的库使用一个接口。例如:

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]
类型ICanSerialize=
抽象到可序列化:单元->IDictionary
B类(项目:obj[])=
接口序列化
成员_uu.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)
让内联toSerializable x=
(^T:(可序列化的成员:单位->IDictionary)x)
设x=obj()
设d=toSerializable(unbox x)

但显然,不可能将运行时强制转换和内联结合起来。

如果我正确理解了您的问题,您希望有一些类似强制转换的操作,该操作接受未知类型的动态加载对象(
System.object
),并将其强制转换为某种结构类型,优先保证对象支持此类型指定的所有操作

我不认为有一个标准的机制来实现这一点,但它可以使用
System.Reflection.
Emit
来实现。我为您实现了类似的功能

其思想是编写一个函数,动态生成一个实现接口的类,接口的所有成员都被简单地委托给包装对象的成员。在包装对象时,可以检查所有成员是否存在并具有正确的签名(但对象实际上不必实现相同的接口)


对于代码示例来说,这有点太多的代码了,但是我希望总体思路也会有用(如果您想了解如何在那里实现,请搜索
NewObject
方法)。

谢谢,我会看看这个。虽然,
Reflection.Emit
对于我试图解决的问题来说有点过头了。