Разбор строки для перечисления в F # - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь сделать следующее (которое не компилируется):

let Parse<'T> value =
    Enum.Parse(typedefof<'T>, value) :?> 'T

Короче говоря, я хотел бы передать тип enum и строку и получить обратно значение enum. Пример использования будет:

type MyEnums =
    | Green = 0,
    | Blue = 1

, а затем:

let r = Parse<MyEnums> "Green"

Какой будет синтаксис? Я еще не использовал дженерики в F #, вот что я придумал, читая документы. Бонусный вопрос

будет, если есть способ разбирать перечисления без учета регистра (помимо переворачивания всегонапример, в нижнем регистре)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Я придумал это в спешке, что, я считаю, имеет преимущество в том, что он не принимает другие типы, кроме перечислений. У меня не было времени, чтобы найти лучший способ, если он есть. Кроме того, базовый тип должен быть int, и у меня не было времени, чтобы посмотреть, есть ли что-то с этим сделать.

type MyEnum = | A = 1 | B = 2

let parseEnum<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType and 'T : enum<int>> v =
    match Enum.TryParse<'T> v with
    | true, v -> Some v
    | false, _ -> None

let x = parseEnum<MyEnum> "B"
match x with
| Some x -> printfn "%A" x
| None -> printfn "Sorry"

// let z = parseEnum<int> "1"  //  won't compile
0 голосов
/ 08 ноября 2019

Этот делает компиляцию для меня (также без true, вы open System?):

let Parse<'T> value =
    System.Enum.Parse(typedefof<'T>, value, true) :?> 'T

и работает без учета регистра для

type MyEnums =
    | Green = 0
    | Blue = 1

Parse<MyEnums> "Green" // Green
Parse<MyEnums> "blue" // Blue
...