2017-01-13 1 views
2

Ich kann dies tun:F #: Attribute zu diskriminierten Gewerkschaftsfeldern?

type AttrAttribute() = 
    inherit Attribute() 

type MyDU = 
    | [<Attr>]A of bool 
    | [<Attr>]B of int * string 
    | [<Attr>]C of byte * char * int64 

... aber ist es eine Möglichkeit, dies zu tun?

type MyDU = 
    | A of [<Attr>]bool 
    | B of int * [<Attr>]string 
    | C of [<Attr>]byte * char * [<Attr>]int64 

Offenbar sind die Fallwerte nur Felder (z let v = B (13, "oops") in (Microsoft.FSharp.Reflection.FSharpValue.GetUnionFields (v, v.GetType()) |> fst).GetFields()), so hoffe ich, dies machbar ist, irgendwie.

+0

Ich versuchte, die DU Felder sowie Putting paretheses an wenigen Stellen zu benennen, aber das scheint nicht zu helfen. – TeaDrivenDev

+0

Richtig, ich hatte versucht, sie auch zu benennen. "Anonyme Variablen sind in dieser Deklaration nicht erlaubt." Klingt wie ein falscher Fehler. – MiloDC

+1

Ich habe das schon mal versucht und ich konnte auch keinen Weg finden. Dies könnte ein guter Vorschlag für https://github.com/fsharp/fslang-suggestions sein. – Tarmil

Antwort

0

Das ist ziemlich gekünstelt:

type A_ = { [<Attr>] Item1 : int } 
type B_ = { [<Attr>] Item1 : int; [<Attr>] Item2 : string } 

type MyDU = 
    | A of A_ 
    | B of B_ 

Und

let v = A({Item1 = 1}) 
let record = ((FSharpValue.GetUnionFields (v, v.GetType()) |> fst).GetFields()) |> Array.head 
let attrs = record.PropertyType.GetProperties() |> Array.collect(fun p -> p.GetCustomAttributes(false)) 
+0

Das ist nur Dekoration Eigenschaften von Datensätzen. Es ist eine OK-Arbeit, aber bindende DU-Werte wären weniger einfach, und Muster, die zu ihnen passen, wären ausführlicher/komplizierter. – MiloDC

+0

@MiloDC ist die einzige Problemumgehung, die ich mir vorstellen kann, da F # diese Syntax nicht unterstützt. – Asti

+0

Warum lösen Sie es nicht mit einem Wrapping-Typ und impliziten Operatoren? – Asti

Verwandte Themen