我有一个带掩码的错误代码的枚举,带有字符串表示和二进制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())
但现在我仍然坚持如何打印实际的字符串
答案 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