Włącz Enum (z atrybutem Flags) bez deklarowania każdej możliwej kombinacji?
w jaki sposób włączyć enum, które ma ustawiony atrybut flags (lub bardziej precyzyjnie jest używany do operacji bitowych)?
Chcę mieć możliwość trafienia we wszystkie przypadki w przełączniku, który odpowiada zadeklarowanym wartościom.
Problem polega na tym, że jeśli mam następujące wyliczenie
<code>[Flags()]public enum CheckType { Form = 1, QueryString = 2, TempData = 4, } </code>
i chcę użyć takiego przełącznika
<code>switch(theCheckType) { case CheckType.Form: DoSomething(/*Some type of collection is passed */); break; case CheckType.QueryString: DoSomethingElse(/*Some other type of collection is passed */); break; case CheckType.TempData DoWhatever(/*Some different type of collection is passed */); break; } </code>
Jeśli „theCheckType” jest ustawione zarówno na CheckType.Form | CheckType.TempData Chcę, żeby trafił w obie skrzynki. Oczywiście nie trafi zarówno w moim przykładzie z powodu przerwy, ale poza tym również nie powiedzie się, ponieważ CheckType.Form nie jest równy CheckType.Form | CheckType.TempData
Jedynym rozwiązaniem, jakie widzę, jest stworzenie argumentu dla każdej możliwej kombinacji wartości wyliczonych?
Coś jak
<code> case CheckType.Form | CheckType.TempData: DoSomething(/*Some type of collection is passed */); DoWhatever(/*Some different type of collection is passed */); break; case CheckType.Form | CheckType.TempData | CheckType.QueryString: DoSomething(/*Some type of collection is passed */); DoSomethingElse(/*Some other type of collection is passed */); break; ... and so on... </code>
Ale to naprawdę nie jest bardzo pożądane (ponieważ szybko stanie się bardzo duże)
W tej chwili zamiast tego mam 3 Jeśli warunki są poprawne
Coś jak
<code>if ((_CheckType & CheckType.Form) != 0) { DoSomething(/*Some type of collection is passed */); } if ((_CheckType & CheckType.TempData) != 0) { DoWhatever(/*Some type of collection is passed */); } .... </code>
Ale oznacza to również, że jeśli mam wyliczenie z 20 wartościami, to musi za każdym razem przejść przez 20 warunków, zamiast „skakać” tylko do potrzebnej „skrzynki” / tak jak przy użyciu przełącznika.
Czy jest jakieś magiczne rozwiązanie, aby rozwiązać ten problem?
Pomyślałem o możliwości przechodzenia przez zadeklarowane wartości, a następnie użycia przełącznika, wtedy trafiłby tylko na przełącznik dla każdej zadeklarowanej wartości, ale nie wiem, jak to zadziała i czy wice wydajności są dobrym pomysłem ( w porównaniu do wielu jeśli?
Czy istnieje łatwy sposób na przejście przez wszystkie zadeklarowane wartości wyliczeniowe?
Mogę wymyślić tylko użycie ToString () i dzielenie przez „,”, a następnie przechodzić przez tablicę i analizować każdy pojedynczy ciąg.
AKTUALIZACJA:
Widzę, że nie wykonałem wystarczająco dobrej pracy wyjaśniającej. Mój przykład jest prosty (starałem się uprościć mój scenariusz).
Używam go do ActionMethodSelectorAttribute w Asp.net MVC, aby określić, czy metoda powinna być dostępna podczas rozwiązywania adresu URL / trasy.
Robię to, deklarując coś takiego w metodzie
<code>[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")] public ActionResult Index() { return View(); } </code>
Oznaczałoby to, że powinien sprawdzić, czy formularz lub TempData mają klucz określony dla metody, która ma być dostępna.
Metody, które będą wywoływać (doSomething (), doSomethingElse () i doWhatever () w moim poprzednim przykładzie) będą miały bool jako wartość zwracaną i będą wywoływane z parametrem (różne kolekcje, które nie mają interfejsu, który może być używane - zobacz mój przykładowy kod w linku poniżej itp.).
Mam nadzieję, że lepiej przedstawię, co robię, wkleiłem prosty przykład tego, co aktualnie robię na pastebinie - można go znaleźć tutajhttp://pastebin.com/m478cc2b8