Eine diskriminierte Union in F # wird zu einer abstrakten Klasse kompiliert und ihre Optionen werden zu verschachtelten konkreten Klassen.
%Vor%DU ist abstrakt, während DU.A und DU.B konkret sind.
Mit ServiceStack kann die Serialisierung von Typen zu JSON-Strings und zurück mit Funktionen angepasst werden. In Bezug auf den DU-Typ, hier ist, wie ich es in C # tun konnte.
%Vor%Ist F # die von den diskriminierten Gewerkschaften zusammengetragenen Formen bekannt? Wie bekomme ich den Typ von DU.A in F # zur Kompilierzeit?
%Vor%Ich kann leicht eine Funktion für die Deserialisierung in F # registrieren.
%Vor%Ist es möglich, Serialisierungsfunktionen für die Betontypen DU.A und DU.B vollständig in F # zu registrieren?
Während das gesamte Verhalten (die abstrakten Klassen usw.) nicht nur ein Implementierungsdetail ist, wird es tatsächlich durch die Spezifikation definiert. Diese Dinge sind nicht von F # aus zugänglich - dies ist ein Zitat aus der Spezifikation.
Ein kompilierter Union-Typ U hat:
· Eine CLI-statische Getter-Eigenschaft U.C für jeden Null-Union-Fall C. Diese Eigenschaft ruft ein Singleton-Objekt ab, das jeden solchen darstellt Fall.
· Ein CLI-verschachtelter Typ U.C für jeden Nicht-Null-Vereinigungsfall C. Dies type hat die Instanzeigenschaften Item1, Item2 .... für jedes Feld der Vereinigungsfall oder ein Einzelinstanz-Eigenschaft-Element, wenn es nur einen gibt Feld. Ein kompilierter Union-Typ, der nur einen Fall hat, tut dies jedoch nicht habe einen verschachtelten Typ. Stattdessen spielt der Unionstyp selbst die Rolle von der Falltyp.
· Eine statische CLI-Methode U.NewC für jeden Nicht-Null-Vereinigungsfall C. Diese Methode erstellt ein Objekt für diesen Fall.
· Eine CLI-Instanzeigenschaft U.IsC für jeden Fall C. Dies Eigenschaft gibt für den Fall wahr oder falsch zurück.
· Eine CLI-Instanzeigenschaft U.Tag für jeden Fall C. Dies property holt oder berechnet ein Integer-Tag, das dem Case entspricht.
· Wenn U mehr als einen Fall hat, hat es einen verschachtelten CLI-Typ U.Tags. Der Typ U.Tags enthält ein Integer-Literal für jeden Fall in steigende Reihenfolge beginnend bei Null.
· Ein kompilierter Unionstyp verfügt über die Methoden, die erforderlich sind implementiert seine automatisch generierten Schnittstellen zusätzlich zu allen benutzerdefinierte Eigenschaften oder Methoden.
Diese Methoden und Eigenschaften können nicht direkt aus F # verwendet werden. Diese Typen haben jedoch benutzerorientierte List.Empty, List.Cons, Option.None und Option.Some Eigenschaften und / oder Methoden.
Wichtig: "Diese Methoden und Eigenschaften dürfen nicht von F # verwendet werden."
Die Tatsache, dass ein DU in F # ein einzelner Typ ist, ist der Schlüssel zu seiner Nützlichkeit. Der F # -Ansatz wäre, Mustervergleich zu verwenden:
%Vor%Dies sollte funktionieren, weil die Union-Fälle nicht nur verschachtelte Typen in C # sind, sondern auch Subtypen. Wenn ServiceStack Basistyp-Serialisierer nicht berücksichtigt, funktioniert das natürlich nicht.
Daniel hat Recht, Sie können dies tun, indem Sie Serialisierungsfunktionen für den Basistyp DU
registrieren. Hier ist ein vollständigeres Beispiel
Ergebnis:
%Vor%Tags und Links f# servicestack servicestack-text