Enums 从判别并集映射到枚举

Enums 从判别并集映射到枚举,enums,f#,discriminated-union,Enums,F#,Discriminated Union,目前,我正试图通过制作一个由C#GUI层和F#业务层组成的应用程序来教自己一些F。在GUI层中,用户在某些时候必须通过选择作为简单枚举一部分的值进行选择,例如,选择以下任一项: enum {One, Two, Three} 我编写了一个函数,将枚举值转换为F#判别并集 type MyValues = | One | Two | Three 现在我必须翻译回来,我已经厌倦了样板代码。是否有一种通用方法可以将我的受歧视的并集转换为相应的枚举,反之亦然 干杯,您还可以在F#中定义枚举

目前,我正试图通过制作一个由C#GUI层和F#业务层组成的应用程序来教自己一些F。在GUI层中,用户在某些时候必须通过选择作为简单枚举一部分的值进行选择,例如,选择以下任一项:

enum {One, Two, Three}
我编写了一个函数,将枚举值转换为F#判别并集

type MyValues = 
  | One
  | Two
  | Three
现在我必须翻译回来,我已经厌倦了样板代码。是否有一种通用方法可以将我的受歧视的并集转换为相应的枚举,反之亦然


干杯,

您还可以在F#中定义枚举,并避免完全进行转换:

type MyValues = 
  | One = 0
  | Two = 1
  | Three = 2

=
位告诉F#编译器它应该将类型编译为一个并集。使用C#中的类型时,这将显示为完全正常的枚举。唯一的危险是,来自C#的人可以使用
(MyValues)4
调用您的代码,这将进行编译,但如果您在F#中使用
match
,则会导致不完整的模式匹配异常。

以下是通用的DU/enum转换器

open Microsoft.FSharp.Reflection

type Union<'U>() =
    static member val Cases = 
        FSharpType.GetUnionCases(typeof<'U>)
        |> Array.sortBy (fun case -> case.Tag)
        |> Array.map (fun case -> FSharpValue.MakeUnion(case, [||]) :?> 'U)

let ofEnum e = 
    let i = LanguagePrimitives.EnumToValue e
    Union.Cases.[i - 1]

let toEnum u = 
    let i = Union.Cases |> Array.findIndex ((=) u)
    LanguagePrimitives.EnumOfValue (i + 1)

let du : MyValues = ofEnum ConsoleColor.DarkGreen
let enum : ConsoleColor = toEnum Three
打开Microsoft.FSharp.Reflection
类型(活接头)
|>Array.sortBy(有趣的case->case.Tag)
|>Array.map(有趣的case->FSharpValue.MakeUnion(case,[| |]):?>'U)
设ofEnum e=
设i=LanguagePrimitives.EnumToValue e
工会.案例[i-1]
设toEnum u=
设i=Union.Cases |>Array.findIndex((=)u)
LanguagePrimitives.EnumOfValue(i+1)
让du:MyValues=ofEnum ConsoleColor.DarkGreen
让enum:ConsoleColor=toEnum三
它将DU标记映射到枚举基础值