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
    ] 

Antworten auf die Frage(3)

Ihre Antwort auf die Frage