【问题标题】:F# HashCode to enum conversionF# HashCode 到枚举的转换
【发布时间】:2015-05-14 12:07:21
【问题描述】:

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

但现在我被困在如何打印实际字符串上

【问题讨论】:

    标签: error-handling enums f# hashcode bitmask


    【解决方案1】:

    如果您使用System.Flags 属性装饰您的ErrorCodes 类型,那么.ToString 将格式化为值名称列表。

    [<System.Flags>]
    type ErrorCodes = ...
    
    let errors = ErrorCodes.InvalidInputError ||| ErrorCodes.UnknownError
    
    printfn "%O" errors
    

    【讨论】:

      【解决方案2】:

      如果出于某种原因,您不想使用默认标志 ​​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)
      

      输出:

      无效输入错误 未知错误

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多