2012-12-13 15 views
7

Rozważmy mam tę metodę rozszerzenia:sprawdzić, jeśli enum ma jakieś flagi wspólne

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; 
} 

a następującą sytuację:

[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 

Chcę sprawdzić, jeśli foo ma jakieś flagi wspólnych z pasek, ale w metodzie rozszerzenia powinno być lepsze rozwiązanie tego zachowania.

Próbowałem też w ten sposób, ale zawsze zwraca 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; 
    } 

Odpowiedz

2

Coś

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

& daje 1 dla każdego bitu, który jest ustawiony w obu teksty stałe, to, czy istnieją jakiekolwiektakich bitów wynik jest niezerowa.

(Użyłem long w nadziei, że będzie pracować dla każdego typu stanowi podstawę wyliczenia;. int powinno być w porządku w danym przypadku)

+0

Dzięki, bardzo miło! – Erpel

6

można po prostu rzucać wartość Enum do ulong (aby uwzględnić możliwość, że typ bazowy nie jest domyślnym int). Jeśli wynik! = 0, została ustawiona co najmniej jedna flaga.

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

Pamiętaj, że pod koniec dnia, enum jest wspierany przez jednego bajta, sbyte, krótkie, ushort, int, uint, długie, lub ulong.

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

Flaga ustawiany jest taka sama jak odpowiedni bit jest włączona w rodzaju podłoża. Powyższe wartości będą miały wartość 0 tylko wtedy, gdy wszystkie bity zostaną wyłączone.

+0

Chyba masz zły pomysł, zmodyfikowałem moje pytanie do wyczyszczenia rzeczy w górę. Ciągłe używanie numeru bazowego może być rozwiązaniem. – Erpel

+0

Ponadto, nawet jeśli byłaby to "ustawiona dowolna zdefiniowana flaga", nie byłaby w stanie zwrócić prawidłowego wyniku, jeśli bit został ustawiony w jakiś sposób, co nie było jedną ze zdefiniowanych flag. – Rawling