簡體   English   中英

使用Enum.HasFlag()檢查UInt16是否有標志?

[英]Checking UInt16 for flags using Enum.HasFlag()?

我有一個C#/。NET 4.0應用程序,該應用程序從網絡連接接收並解析一些數據。 我需要解析的一個特定數據是代表一組標志的UInt16值。 我定義了一個枚舉來表示這些標志,如下所示:

public enum Fields
{
    None = 0,
    FirstFlag = 1,
    SecondFlag = 2,
    ThirdFlag = 4,
    FourthFlag = 8,
    FifthFlag = 16,
    SixthFlag = 32,
    SeventhFlag = 64,
    EighthFlag = 128
}

我將嘗試在此UInt16值上使用按位運算符,以確定它所指示的標志已被設置。 但是隨后我遇到了Enum.HasFlag()方法,乍一看,這似乎比按位操作容易。 我一直在嘗試使用以下方法來確定在UInt16值中設置了哪些標志:

public static void CheckForSetFields(Fields value)
{
    if (value.HasFlag(Fields.None))
    {
        System.Diagnostics.Debug.WriteLine("No fields are set!");
    }
    else
    {
        if (value.HasFlag(Fields.FirstFlag))
        {
            System.Diagnostics.Debug.WriteLine("First flag is set.");
        }
        if (value.HasFlag(Fields.SecondFlag))
        {
            System.Diagnostics.Debug.WriteLine("Second flag is set.");
        }

        // etc., etc.

        if (value.HasFlag(Fields.EighthFlag))
        {
            System.Diagnostics.Debug.WriteLine("Eighth flag is set.");
        }
    }
}

該方法顯然采用了類型為Fields的參數(我的枚舉),但是我正在使用發送給我的UInt16值。 我假設我需要將UInt16轉換為Fields枚舉的實例,但是我不確定該怎么做。 它似乎不像只是強制轉換那樣簡單(它既不會給我帶來錯誤,也不會返回預期的結果)。 是否可以使用Enum.HasFlag()做到這一點,還是應該只實現按位操作並完成它?

我假設我需要將UInt16轉換為Fields枚舉的實例,但是我不確定該怎么做。

這很容易-您需要轉換為枚舉的基礎類型,然后可以轉換為枚舉本身:

Fields value = (Fields) (int) incomingValue;

編輯:如注釋中所述,此檢查不會執行您想要的操作:

if (value.HasFlag(Fields.None))

文檔中

如果flag的基礎值為零,則該方法返回true

基本上你想要:

if (value == 0)

代替該測試。

也許您想要UInt16類型的枚舉?

使用enum SomeFlag : UInt16 { }聲明您的枚舉enum SomeFlag : UInt16 { }然后使用(SomeFlag)someValue將值直接轉換為枚舉將起作用。

最好將[Flags]屬性添加到您的標志枚舉。 它實際上並沒有做任何事情,但是您可以告訴自己和其他查看者這是一個標志,並且調試器將在監視面板中顯示組合標志而不是數字值。

問題在於,在您的第一個if中,您將您的值與0進行比較。HasFlag使用value的按位與和以及所傳遞的enum和bitwise以及任何值與0的結果為0的結果。

暫無
暫無

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

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