Question

Je veux obtenir l'équivalent de Enum.GetName pour un F # discriminé membre du syndicat. Appel ToString() me donne TypeName + MemberName, ce qui est exactement ce que je veux. Je pourrais sousChaîne, bien sûr, mais est-il sûr? Ou peut-être il y a une meilleure façon?

Était-ce utile?

La solution

Vous devez utiliser les classes dans l'espace de noms Microsoft.FSharp.Reflection donc:

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