Frage

Ich möchte das Äquivalent von Enum.GetName für ein F # diskriminiert Gewerkschaftsmitglied bekommen. ToString() Aufruf gibt mir Type-Namen + Member, die nicht genau das, was ich will. Ich kann es String, natürlich, aber ist es sicher? Oder vielleicht gibt es einen besseren Weg?

War es hilfreich?

Lösung

Sie müssen die Klassen im Microsoft.FSharp.Reflection Namespace verwenden, so:

open Microsoft.FSharp.Reflection

///Returns the case name of the object with union type 'ty.
let GetUnionCaseName (x:'a) = 
    match FSharpValue.GetUnionFields(x, typeof<'a>) with
    | case, _ -> case.Name  

///Returns the case names of union type 'ty.
let GetUnionCaseNames <'ty> () = 
    FSharpType.GetUnionCases(typeof<'ty>) |> Array.map (fun info -> info.Name)

// Example
type Beverage =
    | Coffee
    | Tea

let t = Tea
> val t : Beverage = Tea

GetUnionCaseName(t)
> val it : string = "Tea"

GetUnionCaseNames<Beverage>()
> val it : string array = [|"Coffee"; "Tea"|]
scroll top