2015-05-14 64 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