2014-09-04 26 views
0

我有一個C#/。NET 4.0應用程序接收和分析網絡連接的一些數據。我需要解析的一個特定數據片段是一個表示一組標誌的UInt16值。我定義表示這些標誌像這樣的枚舉:使用Enum.HasFlag()檢查標誌的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."); 
     } 
    } 
} 

這種方法顯然需要類型的字段(我的枚舉),但我有UINT16值的工作參數那是發給我的。我假設我需要將UInt16轉換爲Fields枚舉的實例,但我不知道如何做到這一點。它看起來並不像僅僅投射它那麼簡單(它不會給我一個錯誤,但也不會返回預期的結果)。是否有可能使用Enum.HasFlag()做到這一點,或者我應該只是實施按位操作並完成它?

+0

您的預期結果是什麼? – brz 2014-09-04 19:10:25

回答

3

我假設我需要將UInt16轉換爲Fields枚舉的實例,但我不知道該怎麼做。

這很簡單 - 你需要轉換爲基礎類型的枚舉,然後就可以轉換爲枚舉本身:

Fields value = (Fields) (int) incomingValue; 

編輯:正如在評論中指出,該檢查不你希望它是什麼:

if (value.HasFlag(Fields.None)) 

documentation

如果標誌的基礎值爲零,則該方法返回true

基本上你想要的:

if (value == 0) 

該測試來代替。

+0

謝謝喬恩。我正在尋找一種快速的方法來測試所有可能的標誌值組合,所以我在for循環中嘗試了這個方法,其中incomingValue爲0到Int16.MaxValue。循環的每次迭代都會調用CheckForSetFields(value),它始終導致「沒有字段已設置!」被寫入調試輸出。不應該有一些標誌組合,如果(value.HasFlag(Fields.None))是錯誤的?希望這是有道理的。再次感謝你的回覆。 – user685869 2014-09-04 19:10:24

+0

@ user685869:基本上'HasFlag(Fields.None)'不正確 - 我將編輯我的答案來解釋。 – 2014-09-04 20:26:27

+0

感謝您的額外解釋,Jon! – user685869 2014-09-05 10:59:07

0

問題是,在你的第一個if,你正在比較你的值爲0. HasFlag使用按位和值的傳遞枚舉和結果的位和任何值和0是0.所以你不會得到到其他條件。

1

也許你想要一個與UInt16類型的枚舉?

聲明您的枚舉使用enum SomeFlag : UInt16 { }然後將值直接轉換爲枚舉,使用(SomeFlag)someValue,將工作。

最好將[Flags]屬性添加到您的標誌枚舉中。它並沒有真正做什麼,但你可以告訴自己和其他觀衆這是一個標誌,調試器將在面板中顯示組合標誌,而不是數值。