2010-10-13 22 views
5

Chcę wykonać metodę rozszerzenia, aby sprawdzić, czy wyliczenie ma flagę.Metoda rozszerzenia C#, aby sprawdzić, czy wyliczenie ma ustawiony znacznik

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)) 
    ... 

Jak mogę to zrobić? (Jeśli nie jest klasa, która już robi to wtedy byłbym wdzięczny wyjaśnienie w jaki sposób można to być kodowane;! I już zostały aprowizacji z tej metody zbyt długo)

góry dzięki

+0

możliwy duplikat [Rozszerzanie Enum w C#] (http://stackoverflow.com/questions/1647634/extending-enum-in-c) –

+0

To faktycznie pomogło, dzięki za znalezienie. – Marlon

Odpowiedz

10

.NET 4 zawiera już tę funkcjonalność, więc jeśli to możliwe, uaktualnij.

days.HasFlag(DaysOfWeek.Monday); 

Jeśli to nie jest możliwe, aby uaktualnić, tutaj jest realizacja tego sposobu:

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

Można łatwo zbudować równoważną metodę rozszerzenia:

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

Niestety nie udało się dokonać aktualizacji. Dzięki za szybką odpowiedź – Marlon

0

Niedawno wpadłem na to problem.

Jeśli nie wiesz, jaki jest typ Enum, możesz rzucić Enum do int i użyć metod statycznych Enum do analizy nazwy pola Enum na wartość i użycia op_BitwiseAnd do porównania wartości.

Zaktualizuję to później za pomocą kodu, jeśli jesteś zainteresowany, ale idę teraz do drzwi.

Powiązane problemy