これは、タイプ セーフな方法でサードパーティの型を拡張するという以前の質問に関連しています。いくつかの良い答えがありましたが、それらはコンパイル時に認識されている具象型に依存しています。私はこれに依存することはできません。型が箱入りの場合もあります。サードパーティの型を拡張して動的ディスパッチをシミュレートする方法はありますか?
私は自分のライブラリにインターフェースを使用します。例えば:
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)
しかし、ランタイム キャストとインライン化を組み合わせることは明らかに不可能です。