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
[Flags()]public enum CheckType
{
Form = 1,
QueryString = 2,
TempData = 4,
}
i chcę użyć takiego przełącznika
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;
}
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
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...
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
if ((_CheckType & CheckType.Form) != 0)
{
DoSomething(/*Some type of collection is passed */);
}
if ((_CheckType & CheckType.TempData) != 0)
{
DoWhatever(/*Some type of collection is passed */);
}
....
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
[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
return View();
}
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