2012-12-13 196 views
7

考慮我有這樣的擴展方法:檢查是否一個枚舉有任何標誌共同

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value) 
{ 
    var flags = value.ToString().Split(new string[] { ", " }, 
            StringSplitOptions.None); 
    foreach (var flag in flags) 
    { 
     if (type.ToString() == flag) 
      return true; 
    } 
    return false; 
} 

而以下情況:

[Flags] 
enum Bla 
{ 
    A = 0, 
    B = 1, 
    C = 2, 
    D = 4 
} 

Bla foo = Bla.A | Bla.B; 
Bla bar = Bla.A; 

bar.HasAnyFlagInCommon(foo); //returns true 

我要檢查,如果foo在共同的任何標誌與吧,但是在擴展方法中有一個更好的方法來解決這個問題。

我也試過這樣的,但總是返回true:

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value) 
    { 
     var flags = Enum.GetValues(value.GetType()).Cast<Enum>() 
           .Where(item => value.HasFlag(item)); 
     foreach (var flag in flags) 
     { 
      if (type == flag) 
       return true; 
     } 
     return false; 
    } 

回答

2

喜歡的東西

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value) 
{ 
    return (((long)type) & ((long)value)) != 0; 
} 

&給出1對於在兩個枚舉設置的任何位,因此,如果有任何這樣位結果爲非零。

(我希望它會爲任何類型伏於枚舉工作中使用long; int應該在你的情況下罰款)

+0

謝謝,非常好! – Erpel

6

您可以枚舉值簡單地轉換爲ULONG(考慮到的可能性,潛在的類型不是默認int)。如果結果!= 0,則至少設置一個標誌。

ulong theValue = (ulong)value; 
return (theValue != 0); 

記住,在這一天結束時,枚舉是字節,爲sbyte,短,USHORT,INT,UINT,長或ulong的一個支持。

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

一個標誌被設定爲作爲對應的位在背襯類型被接通一樣。如果所有位都關閉,上面的ulong只會是0。

+0

我覺得你有錯誤的想法,我編輯我的問題,以澄清事實向上。仍然使用底層號碼可能是一個解決方案。 – Erpel

+0

另外,即使這是「任何已定義的標誌集合」,它也不會返回正確的結果,如果某個位已被設置爲某種不是所定義的標誌之一。 – Rawling