F# の識別共用体は抽象クラスにコンパイルされ、そのオプションは入れ子になった具象クラスになります。
type DU = A | B
DU は抽象的ですが、DU.A と DU.B は具体的です。
ServiceStack を使用すると、型の JSON 文字列へのシリアル化とその逆のシリアル化を関数でカスタマイズできます。DU 型に関しては、C# で行う方法を次に示します。
using ServiceStack.Text;
JsConfig<DU.A>.SerializeFn = v => "A"; // Func<DU.A, String>
JsConfig<DU.B>.SerializeFn = v => "B"; // Func<DU.B, String>
JsConfig<DU>.DeserializeFn = s =>
if s == "A" then DU.NewA() else DU.NewB(); // Func<String, DU>
F# は、識別された共用体のコンパイル済みフォームを認識していますか? コンパイル時に F# で DU.A の型を取得するにはどうすればよいですか?
typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined
F# で逆シリアル化する関数を簡単に登録できます。
open System
open ServiceStack.Text
JsConfig<DU>.RawDeserializeFn <-
Func<_, _>(fun s -> printfn "Hooked"; if s = "A" then A else B)
具体的な型 DU.A および DU.B のシリアル化関数を完全に F# に登録することは可能ですか?