Czasami podczas czytania kodu C # innych osób widzę metodę, która akceptuje wiele wartości wyliczenia w jednym parametrze. Zawsze myślałem, że to całkiem fajne, ale nigdy się nad tym nie zastanawiałem.
Cóż, teraz myślę, że mogę tego potrzebować, ale nie wiem jak
- ustaw podpis metody, aby to zaakceptować
- pracować z wartościami w metodzie
- zdefiniować wyliczenie
aby osiągnąć tego rodzaju rzeczy.
W mojej konkretnej sytuacji chciałbym skorzystać z System.DayOfWeek, który jest zdefiniowany jako:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Chcę mieć możliwość przekazania jednej lub więcej wartości DayOfWeek do mojej metody. Czy będę mógł używać tego konkretnego wyliczenia w obecnej postaci? Jak mam wykonać 3 rzeczy wymienione powyżej?
Odpowiedzi:
Kiedy definiujesz wyliczenie, po prostu przypisz mu [Flags], ustaw wartości na potęgę dwójki i będzie działać w ten sposób.
Nic innego się nie zmienia, poza przekazywaniem wielu wartości do funkcji.
Na przykład:
Aby uzyskać więcej informacji, zobacz dokumentację MSDN dotyczącą typów wyliczenia .
Edytuj w odpowiedzi na dodatki do pytania.
Nie będziesz mógł użyć tego wyliczenia w takiej postaci, w jakiej jest, chyba że chcesz zrobić coś takiego, jak przekazanie go jako tablica / kolekcja / tablica parametrów. Umożliwiłoby to przekazanie wielu wartości. Składnia flag wymaga, aby wyliczenie było określone jako flagi (lub aby język był bastardowany w sposób, który nie został zaprojektowany).
źródło
Myślę, że bardziej eleganckim rozwiązaniem jest użycie HasFlag ():
źródło
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Druga odpowiedź Reeda. Jednak podczas tworzenia wyliczenia należy określić wartości dla każdego elementu członkowskiego wyliczenia, aby było to pole bitowe. Na przykład:
źródło
Nie możesz użyć System.DayOfWeek jako
[Flags]
wyliczenia, ponieważ nie masz nad nim kontroli. Jeśli chcesz mieć metodę, która akceptuje wieleDayOfWeek
, będziesz musiał użyćparams
słowa kluczowegoW przeciwnym razie możesz utworzyć własne
[Flags]
wyliczenie opisane przez wielu innych respondentów i użyć porównań bitowych.źródło
Musisz określić liczby i zwiększać je w ten sposób, ponieważ przechowuje wartości w sposób bitowy.
Następnie po prostu zdefiniuj metodę, aby wziąć to wyliczenie
i nazwać to czymś w rodzaju
Aby sprawdzić, czy jedna z wartości wyliczenia została uwzględniona, sprawdź je za pomocą operacji bitowych, takich jak
źródło
wywołaj metodę w tym formacie
MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Th Thursday);
Zaimplementuj metodę EnumToArray, aby uzyskać przekazane opcje
źródło
Oznacz swoje wyliczenie atrybutem [Flags]. Upewnij się również, że wszystkie twoje wartości wykluczają się wzajemnie (dwie wartości nie mogą się sumować, aby się równać), jak 1,2,4,8,16,32,64 w twoim przypadku
Jeśli masz metodę, która akceptuje wyliczenie DayOfWeek, użyj operatora bitowego lub (|), aby używać wielu elementów członkowskich razem. Na przykład:
Aby sprawdzić, czy parametr zawiera określony element członkowski, użyj bitowego i operatora (&) dla elementu członkowskiego, którego szukasz.
źródło
Reed Copsey ma rację i dodałbym do oryginalnego postu, gdybym mógł, ale nie mogę, więc zamiast tego będę musiał odpowiedzieć.
Używanie [Flags] po prostu do starego wyliczenia jest niebezpieczne. Uważam, że podczas używania flag należy jawnie zmienić wartości wyliczenia na potęgi dwóch, aby uniknąć kolizji wartości. Zobacz wytyczne dotyczące FlagsAttribute i Enum .
źródło
Za pomocą opublikowanych odpowiedzi i tych:
Czuję, że całkiem dobrze to rozumiem.
Dzięki.
źródło
Coś takiego powinno wskazywać, czego szukasz:
źródło