按位组合作为整数到枚举

Gfo*_*rse 0 c# vb.net math logic bit

目前我正在尝试解析一个整数,该整数是来自第三方 API 的枚举的按位组合。例如:我收到一个integer值,1035该值包含三个枚举值;

enum Status
    1= "Status 1" 
    2= "Status 2" 
    4= "Status 3" 
    8= "Status 4" 
    ........ 
    1024= "Status 8"
end enum
Run Code Online (Sandbox Code Playgroud)

所以我需要一个将值转换1035为的函数Status 1 + Status 2 + Status 4 + Status 8

尝试将其转换为位,然后使用位移位,但这并没有给我正确的结果...希望有人可以在 C# 或 vb.net 示例中帮助我。

Mat*_*son 6

如果您将该[Flags]属性应用于枚举,它将使枚举ToString()返回一个字符串,该字符串指示设置了哪些位 - 但我认为这对您没有多大用处,除了它在记录枚举方面的作用之外标志枚举。

但是,无论该[Flags]属性是否存在,Enum.HasFlag()都会告诉您该标志是否已设置。

这个示例控制台应用程序应该清楚地说明:

using System;

namespace Demo
{
    [Flags]
    enum Status
    {
        None     = 0,
        Status1  = 1,
        Status2  = 2,
        Status3  = 4,
        Status4  = 8,
        Status5  = 16,
        Status6  = 32,
        Status7  = 64,
        Status8  = 128,
        Status9  = 256,
        Status10 = 512,
        Status11 = 1024
    }

    class Program
    {
        static void Main()
        {
            Status s = (Status)1035;

            Console.WriteLine(s); // "Status1, Status2, Status4, Status11"

            if (s.HasFlag(Status.Status4))               // "Status 4 is set"
                Console.WriteLine("Status4 is set");
            else
                Console.WriteLine("Status4 is not set");

            if (s.HasFlag(Status.Status3))               // "Status 3 is not set"
                Console.WriteLine("Status3 is set");
            else
                Console.WriteLine("Status3 is not set");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:您的枚举似乎缺少一些值!1024 值应该是 Status11,而不是 Status8。

另请注意,为了完整性,我添加了“无”值。