Hat F # Kenntnis von den zusammengestellten Formularen seiner diskriminierten Gewerkschaften?

Eine diskriminierte Union in F # wird zu einer abstrakten Klasse kompiliert und ihre Optionen werden zu verschachtelten konkreten Klassen.

type DU = A | B

DU ist abstrakt, während DU.A und DU.B konkret sind.

Mit ServiceStack kann die Serialisierung von Typen in JSON-Strings und zurück mit Funktionen angepasst werden. In Bezug auf den DU-Typ, hier ist, wie ich es in C # tun könnte.

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>

Hat F # Kenntnis von den zusammengestellten Formularen seiner diskriminierten Gewerkschaften? Wie würde ich den Typ von DU.A in F # zur Kompilierungszeit erhalten?

typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined

Ich kann leicht genug eine Funktion für die Deserialisierung in F # registrieren.

open System
open ServiceStack.Text

JsConfig<DU>.RawDeserializeFn <-
    Func<_, _>(fun s -> printfn "Hooked"; if s = "A" then A else B)

Ist es möglich, Serialisierungsfunktionen für die Betontypen DU.A und DU.B vollständig in F # zu registrieren?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage