Enums 从判别并集映射到枚举
目前,我正试图通过制作一个由C#GUI层和F#业务层组成的应用程序来教自己一些F。在GUI层中,用户在某些时候必须通过选择作为简单枚举一部分的值进行选择,例如,选择以下任一项: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#中定义枚举
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标记映射到枚举基础值