Chcę uzyskać równowartość Enum.GetName
dla członka dyskryminacji F #. Wywołanie ToString()
daje mi TypeName + MemberName, co nie jest dokładnie tym, czego chcę. Mógłbym go podciąć, oczywiście, ale czy to jest bezpieczne? A może jest lepszy sposób?Co to jest odpowiednik Enum.GetName dla członka związku F #?
Odpowiedz
trzeba użyć klas w Microsoft.FSharp.Reflection
nazw tak: (? I szybko z powodu braku refleksji dla jednej z metod)
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"|]
Przyszedłem tutaj ze składnią "' GetUnionFields''' - dzięki za to. Gdy jestem tutaj, pomyślałem, że zwrócę uwagę, że '' 'GetUnionCaseName''' może być napisany nieco bardziej zwięźle jako: ' '' let GetUnionCaseName (e: 'a) = (FSharpValue.GetUnionFields (e, typeof <'a>) |> fst) .Nazwa '' ' – philsquared
Zauważ, że jest to bardzo powolne podejście, Na pewno chcesz buforować wyniki, aby uzyskać trochę wydajności z tego –
@ prac odpowiedziami DanielAsher, ale aby uczynić go bardziej elegancki Chciałbym zrobić to w następujący sposób: (. Zainspirowany this i 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
chciałbym zaproponować coś jeszcze bardziej zwięzły:
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
Kiedy sprawa unii jest prosta, GetName()
może przynieść takie same jak ToString()
:
> let tea = Tea
val tea : Beverage = Tea
> tea.GetName()
val it : string = "Tea"
> tea.ToString()
val it : string = "Tea"
Jednakże, jeśli sprawa unii jest hodowca, nie będzie różnica:.
> 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. Co to jest użycie stałego obiektu związku?
- 2. Co to jest odpowiednik Swift dla dispatch_group_create
- 3. Co to jest odpowiednik addFooterView dla GridView?
- 4. Co to jest odpowiednik coredata dla Androida
- 5. Co to jest odpowiednik WPF dla ControlPaint.Light?
- 6. Co to jest odpowiednik firebaseRef.push() z angularfire?
- 7. Co to jest odpowiednik "pythonic" w Ruby?
- 8. Co to jest rubinowy odpowiednik python'a getattr
- 9. Co to jest odpowiednik Swift 3 NSURL.URLByAppendingPathComponent()?
- 10. Grails3.04, co to jest "f: table"?
- 11. Co to jest składnia F # dla "nie równa się"?
- 12. Co to jest odpowiednik java.sql.Types dla TEKSTU MySQL?
- 13. Co to jest odpowiednik PostgreSQL dla SQL Server NVARCHAR?
- 14. Co to jest odpowiednik java 8 dla transformAndConcat Guava?
- 15. Co to jest odpowiednik Groovy'ego dla dir() w Pythonie?
- 16. Co to jest odpowiednik OSX, C dla uint32 i uint64?
- 17. Co to jest odpowiednik linq dla operatora SQL IN
- 18. Co to jest odpowiednik basha dla csh 'where'?
- 19. Co to jest odpowiednik Matlaba dla "nie w" Pythona?
- 20. Co to jest odpowiednik LINQ-SQL dla Silverlight?
- 21. Co to jest odpowiednik "gem" w python?
- 22. Co to jest odpowiednik UINT32_MAX w C++?
- 23. Co to jest odpowiednik java javascript's String.fromCharCode?
- 24. Co to jest odpowiednik preg_quote w PHP?
- 25. Co to jest odpowiednik opencv do flaplr()?
- 26. Co to jest odpowiednik System.nanoTime() w .NET?
- 27. Co to jest odpowiednik "getElementsByTagName" w jQuery?
- 28. Co to jest odpowiednik Response.Redirect w Silverlight?
- 29. Co to jest deserializacja Jackson odpowiednik @ JsonUnwrapped?
- 30. Co to jest odpowiednik dispatch_block_t w swift?
Uwaga! To samo wyrażenie, x.ToString(), przy różnych uruchomieniach programu czasami da mi AssemblyName + TypeName, a czasami AssemblyName + TypeName + MemberName. Kolejne identyczne wyrażenie tego samego typu w innym miejscu zawsze da mi AssemblyName + TypeName + MemberName. Ten sam problem z x.GetType(). Nazwa. Przyjęta odpowiedź jest dobra. –