2010-10-13 7 views
5

Voglio fare un metodo di estensione per verificare se un'enumerazione ha un flag.Metodo di estensione C# per verificare se un'enumerazione ha un flag impostato

DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday; 
// instead of this: 
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday) 
    ... 

// I want this: 
if (workDays.ContainsFlag(DaysOfWeek.Monday)) 
    ... 

Come posso realizzare questo? (Se c'è una classe che già fa questo allora mi apprezzerebbe una spiegazione di come questo possa essere codificato;! Sono stato nei guai con questo metodo troppo tempo)

grazie in anticipo

+0

possibile duplicato di [Estendi enum in C#] (http://stackoverflow.com/questions/1647634/extending-enum-in-c) –

+0

Che effettivamente ha aiutato, grazie per la ricerca. – Marlon

risposta

10

.NET 4 include già questa funzionalità, quindi, se possibile, l'aggiornamento.

days.HasFlag(DaysOfWeek.Monday); 

Se non è possibile aggiornare, qui è l'attuazione di tale metodo:

public bool HasFlag(Enum flag) 
{ 
    if (!this.GetType().IsEquivalentTo(flag.GetType())) { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType())); 
    } 

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue()); 
    return ((uThis & uFlag) == uFlag); 
} 

Si potrebbe facilmente costruire il metodo di estensione equivalente:

public static bool HasFlag(this Enum @this, Enum flag) 
{ 
    // as above, but with '@this' substituted for 'this' 
} 
+0

Purtroppo non sono stato in grado di eseguire l'aggiornamento. Grazie per la risposta rapida – Marlon

0

Recentemente mi sono imbattuto in questo problema.

Se non si conosce il tipo di Enum, è possibile eseguire il cast di Enum su int e utilizzare i metodi statici Enum per analizzare un nome di campo Enum in un valore e utilizzare op_BitwiseAnd per confrontare i valori.

Aggiungerò questo più avanti con il codice se sei interessato, ma ora sto uscendo dalla porta.

Problemi correlati