F# HashCode 到枚举的转换

F# HashCode to enum conversion

我有一个带有字符串表示和二进制 int 表示的位掩码错误代码枚举:

type ErrorCodes = 
    | NoError = 0
    | InvalidInputError = 1
    | AuthenticationFailedError = 2
    | InvalidArgumentError = 4
    | ItemNotFoundError = 8
    | UnknownError = 16

在我 运行 执行程序时,我使用按位或运算符 (|||) 收集了所有错误。所以现在我有一些看起来像 01100 的东西。我如何打印到控制台:"InvalidArgumentError" 和 "ItemNotFoundError?"

我想到了使用:

for i = 0 to 32 do
    if ((err.GetHashCode() % 2) = 1) then
        Console.WriteLine("ErrorCode: {0}",err.GetHashCode())

但现在我卡在了如何打印实际字符串上

如果您使用 System.Flags 属性修饰 ErrorCodes 类型,则 .ToString 将格式化为值名称列表。

[<System.Flags>]
type ErrorCodes = ...

let errors = ErrorCodes.InvalidInputError ||| ErrorCodes.UnknownError

printfn "%O" errors

如果出于某种原因,您不想使用默认标志 ​​ToString 实现,您可以这样做:

let inline printFlags (flags: 'e) =
    let ty = typeof<'e>
    (Enum.GetValues ty :?> 'e[], Enum.GetNames ty)
    ||> Array.zip
    |> Seq.filter (fun (v, _) -> v <> enum 0 && flags &&& v = v)
    |> Seq.iter (snd >> printfn "%s")

printFlags (ErrorCodes.InvalidInputError ||| ErrorCodes.UnknownError)

输出:

InvalidInputError
UnknownError