2015-05-14 63 views
0

我的位掩码的错误代码与字符串表示和一个二进制INT表示一个枚举:F#哈希码枚举转换

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()) 

但现在我如果您装点您的ErrorCodes型与System.Flags属性,那么.ToString将格式化我被困在如何打印的实际字符串

回答

5

作为价值名称的列表。

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

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

printfn "%O" errors 
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