Erstellen Sie einen diskriminierten Verbindungsfall aus einer Zeichenfolge
Ich versuche, DU-Fälle aus Zeichenfolgen zu erstellen. Die einzige Möglichkeit, dies zu tun, besteht darin, die DU-Fälle über aufzuzählenMicrosoft.FSharp.Reflection.FSharpType.GetUnionCases
und dann die KommissionierungUnionCase
das entspricht der Zeichenfolge (mit.Name
) und dann den eigentlichen DU-Fall mitFSharpValue.MakeUnion
.
Gibt es nicht eine einfachere / elegantere Art, dies zu tun? In meinem Szenario habe ich eine DU mit ein paar hundert Fällen für Schlüsselwörter. Ich muss die Zeichenketten (Schlüsselwörter) aus einer Datei lesen und die Typen daraus machen. Ich habe einige "Optimierungen" vorgenommen, indem ich die Fälle in eine Karte eingefügt habe, aber ich hatte gehofft, dass es einen besseren Weg gibt, dies zu tun.
Ich habe zum Beispiel folgendes:
type Keyword =
| FOO
| BAR
| BAZ
| BLAH
let mkKeywords (file: string) =
use sr = new StreamReader(file)
let caseMap =
FSharpType.GetUnionCases(typeof<Keyword>)
|> Array.map (fun c -> (c.Name, FSharpValue.MakeUnion(c, [||]) :?> Keyword))
|> Map.ofArray
[
while not sr.EndOfStream do
let l = sr.ReadLine().Trim()
match caseMap.TryFind l with
| Some c -> yield c
| None -> failwith <| "Could not find keyword: " + l
]