Ich möchte das Äquivalent von Enum.GetName
für ein F # diskriminiertes Union-Mitglied erhalten. Aufruf ToString()
gibt mir TypeName + MemberName, was nicht genau das ist, was ich will. Ich könnte es natürlich teilen, aber ist es sicher? Oder vielleicht gibt es einen besseren Weg?Was ist das Enum.GetName-Äquivalent für F # -Unionsmitglied?
Antwort
Sie müssen die Klassen im Microsoft.FSharp.Reflection
Namespace verwenden, so: (? Und schnell, weil der Mangel an Reflexion für eine der Methoden)
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"|]
Ich kam hierher wegen der '' 'GetUnionFields''' Syntax - danke dafür. Während ich hier bin, dachte ich, dass '' '' GetUnionCaseName''' könnte etwas prägnanter geschrieben werden als: '' 'lassen GetUnionCaseName (e: 'a) = (FSharpValue.GetUnionFields (e, typeof <'a>) |> fst) .Name''' – philsquared
Beachten Sie, dass dies ein sehr langsamer Ansatz ist. Sie möchten die Ergebnisse auf jeden Fall zwischenspeichern, um einen gewissen Performance-Effekt zu erzielen –
@ DanielAsher Antwort funktioniert, aber es eleganter zu machen , würde ich es auf diese Weise tun: (. Inspiriert von this und this)
type Beverage =
| Coffee
| Tea
static member ToStrings() =
Microsoft.FSharp.Reflection.FSharpType.GetUnionCases(typeof<Beverage>)
|> Array.map (fun info -> info.Name)
override self.ToString() =
sprintf "%A" self
Ich möchte etwas vorzuschlagen noch prägnanter:
open Microsoft.FSharp.Reflection
type Coffee = { Country: string; Intensity: int }
type Beverage =
| Tea
| Coffee of Coffee
member x.GetName() =
match FSharpValue.GetUnionFields(x, x.GetType()) with
| (case, _) -> case.Name
Wenn Vereinigung Fall einfach ist, GetName()
die gleiche wie ToString()
bringen kann:
> let tea = Tea
val tea : Beverage = Tea
> tea.GetName()
val it : string = "Tea"
> tea.ToString()
val it : string = "Tea"
Wenn jedoch Vereinigung Fall ist schicker, es wird ein Unterschied:.
> let coffee = Coffee ({ Country = "Kenya"; Intensity = 42 })
val coffee : Beverage = Coffee {Country = "Kenya"; Intensity = 42;}
> coffee.GetName()
val it : string = "Coffee"
> coffee.ToString()
val it : string = "Coffee {Country = "Kenya"; Intensity = 42;}"
- 1. F # - Was ist das "it" -Schlüsselwort?
- 2. Golang Fprint * was bedeutet das f für
- 3. Grails3.04, was ist "f: table"?
- 4. Ist das ein F # -Angebotsfehler?
- 5. Escape-Sequenz \ f - Formular-Feed - was genau ist das?
- 6. Was ist das "aws_security_token" für
- 7. Für was ist das AttachEvent
- 8. Was bewirkt das Schlüsselwort 'in' in F #?
- 9. Was macht das: Git-Zweig -f
- 10. Was ist das? Art?
- 11. was ist f-measure für jede Klasse in weka
- 12. Was für RavenDB Suchmethode in F # die korrekte Syntax ist
- 13. Was genau ist "bigint" in F #?
- 14. Was ist c printf% f Standardpräzision?
- 15. Facebook API - Was ist "curl -F"?
- 16. F #: Ist das Keyword "Spaß" notwendig?
- 17. Was ist das erwartete Verhalten?
- 18. F # TextEditor Steuerelement für das Web
- 19. Was ist die Laderbestellung für das Webpack?
- 20. Was ist das Standardformat für Zuweisungsausdrücke?
- 21. Für was ist das neue Schlüsselwort?
- 22. Was ist das korrekte Argument für ForeignKeyRawIdWidget?
- 23. Was ist das Repository-Limit für github.com
- 24. Was ist das asynchrone Muster für asyncwasserfall?
- 25. Was ist das Äquivalent PostgreSQL für ISNULL()
- 26. android: id was ist das Pluszeichen für
- 27. Was ist das FIX-Protokoll für Finanzinstitute?
- 28. Was ist das BMP-Format für Graustufenbilder?
- 29. Was ist das beste Datenzugriffsparadigma für Skalierbarkeit?
- 30. Was ist das für eine Javascript-Notation?
Vorsicht! Derselbe Ausdruck, x.ToString(), wird mir bei verschiedenen Programmläufen manchmal AssemblyName + TypeName und manchmal AssemblyName + TypeName + MemberName geben. Ein anderer identischer Ausdruck desselben Typs an anderer Stelle gibt mir immer AssemblyName + TypeName + MemberName. Gleiches Problem mit x.GetType(). Name. Die angenommene Antwort ist gut. –