F#HashCode枚举转换

时间:2015-05-14 12:07:21

标签: error-handling enums f# hashcode bitmask

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

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

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

我只想使用:

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

但现在我仍然坚持如何打印实际的字符串

2 个答案:

答案 0 :(得分:5)

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

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

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

printfn "%O" errors

答案 1 :(得分:0)

如果出于某种原因,您不希望实现默认标志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
相关问题