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

questionAnswers(8)

yourAnswerToTheQuestion