2012-12-13 7 views
7

Considerate ho questo metodo di estensione:controllo se un enum ha qualche bandiere in comune

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

E la seguente situazione:

[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 

voglio verificare se foo ha qualche bandiere in comune con barra, ma ci deve essere un modo migliore per ottenere questo comportamento nel metodo di estensione.

Ho anche provato come questo, ma è restituisce sempre vero:

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

risposta

2

Qualcosa di simile

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

Il &1 per ogni bit impostato in entrambi enums, quindi se ci sono qualsiasi tali bit il risultato è diverso da zero.

(ho usato long nella speranza che funzionerà per qualsiasi tipo sottende l'enumerazione;. int dovrebbe andare bene nel tuo caso)

+0

Grazie, molto bello! – Erpel

6

si può semplicemente lanciare il valore Enum ad un ulong (per tenere conto della possibilità che il tipo di fondo non è l'impostazione predefinita di int). Se il risultato! = 0, almeno un flag è stato impostato.

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

ricordare, alla fine della giornata, l'enumerazione è sostenuta da uno dei byte, sbyte, insomma, ushort, int, uint, a lungo, o ulong.

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

stato impostato un flag è uguale a un bit corrispondente sia attivato nel tipo di supporto. Il ulong precedente sarà solo 0 se tutti i bit sono disattivati.

+0

Penso che hai un'idea sbagliata, ho modificato la mia domanda per chiarire le cose su. Ancora usando il numero sottostante potrebbe essere una soluzione. – Erpel

+0

Inoltre, anche se questo era "sono stati impostati dei flag definiti", non sarebbe _ restituito il risultato corretto se un bit era stato impostato in qualche modo quale non era uno dei flag definiti. – Rawling