簡體   English   中英

按位組合為整數到枚舉

[英]bitwise combination as integer to enum

目前,我正在嘗試解析一個整數,該整數是來自第三方API的枚舉的按位組合。 例如:我收到一個integer ,值為1035該值包含三個枚舉值;

enum Status
    1= "Status 1" 
    2= "Status 2" 
    4= "Status 3" 
    8= "Status 4" 
    ........ 
    1024= "Status 8"
end enum

所以我需要一個將值1035轉換為Status 1 + Status 2 + Status 4 + Status 8的函數

試圖將其轉換為Bit,然后使用位移,但這並不能給我正確的結果……希望有人可以在C#或vb.net示例中為我提供幫助。

如果將[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");
        }
    }
}

注意:您的枚舉似乎缺少一些值! 1024值應為Status11,而不是Status8。

另請注意,為完整性起見,我添加了“無”值。

按位運算符可以用於此問題。 (1 << i)將2賦予冪“ i”。 然后,當且僅當“值”中存在對應的2的冪時,與“值”的按位AND(&)會給出非零數。

public static void GetFlags(int value)
{
    for (int i = 0; i < 20; i++)
    {
        if (((1 << i) & value) > 0)
            Console.WriteLine($"Status {i + 1} is present");
    }
}

您可以使用[Flags]屬性來執行此操作:

[Flags]
enum bla {
  foo = 1,
  bar = 2,
  baz = 4
}

public void Foo() {
  bla flag = (bla)3; // Flags foo and bar
  int andBackToInt = (int)flag; // 3

}

感謝大家的快速回復,非常感謝! :-)

這個屬性對我來說是新的。 第三方枚舉沒有標志,這就是為什么要枚舉的Ctype沒有返回所有值的原因。 因此,我最終復制了所有枚舉值(通過對象瀏覽器很容易),並創建了一個帶有flags屬性集的本地枚舉。 現在,它像我希望的那樣轉換!

謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM