gpt4 book ai didi

f# - 第三方类型的动态调度

转载 作者:行者123 更新时间:2023-12-04 05:51:07 26 4
gpt4 key购买 nike

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

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

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)

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

最佳答案

如果我正确理解您的问题,您希望进行一些类似转换的操作,该操作采用未知类型的动态加载对象( System.Object )并将其转换为某种结构类型,并且最好保证该对象支持所有操作由该类型指定。

我认为没有标准机制,但可以使用 System.Reflection. 来实现。 Emit .我为 interoperability between C# and PHP some time ago 实现了类似的东西.

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

对于代码示例来说,这有点过多,但我希望总体思路也有用(搜索 Phalanger source code 查找 NewObject 方法,如果你想看看它是如何完成的)。

关于f# - 第三方类型的动态调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10030923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com