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
我有一个带有字符串表示和二进制 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