[英]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.