Enum (mit Flags-Attribut) einschalten, ohne jede mögliche Kombination zu deklarieren?

Wie schalte ich eine Enumeration ein, bei der das Attribut flags gesetzt ist (oder genauer gesagt, wird es für Bitoperationen verwendet)?

Ich möchte in der Lage sein, alle Fälle in einem Schalter zu treffen, der den angegebenen Werten entspricht.

Das Problem ist, dass, wenn ich die folgende Aufzählung habe

<code>[Flags()]public enum CheckType
{
    Form = 1,   
    QueryString = 2,
    TempData = 4,
}
</code>

und ich möchte einen Schalter wie diesen verwenden

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

Wenn "theCheckType" auf beide CheckType.Form | festgelegt ist CheckType.TempData Ich möchte, dass es beide Fälle trifft. Offensichtlich wird es in meinem Beispiel wegen der Unterbrechung nicht beides treffen, aber abgesehen davon schlägt es auch fehl, weil CheckType.Form nicht gleich CheckType.Form | ist CheckType.TempData

Wie ich sehe, ist die einzige Lösung, für jede mögliche Kombination der Aufzählungswerte einen Fall zu machen?

So etwas wie

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

Aber das ist wirklich nicht sehr erwünscht (da es schnell sehr groß wird)

Im Moment habe ich 3 If-Zustände direkt nacheinander

So etwas wie

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

Das bedeutet aber auch, dass ich, wenn ich eine Enumeration mit 20 Werten habe, jedes Mal 20 If-Bedingungen durchlaufen muss, anstatt wie bei der Verwendung eines Schalters nur zu den benötigten "case" / s zu "springen".

Gibt es eine magische Lösung, um dieses Problem zu lösen?

Ich habe über die Möglichkeit nachgedacht, die deklarierten Werte zu durchlaufen und dann den Schalter zu verwenden, dann würde er nur für jeden deklarierten Wert auf den Schalter drücken, aber ich weiß nicht, wie es funktionieren wird und ob es eine gute Idee ist, die Leistung zu verbessern ( im vergleich zu vielen ifs)?

Gibt es eine einfache Möglichkeit, alle angegebenen Enum-Werte zu durchlaufen?

Ich kann nur ToString () verwenden und durch "," teilen und dann das Array durchlaufen und jeden einzelnen String analysieren.

AKTUALISIEREN:

Ich sehe, dass ich nicht gut genug gearbeitet habe, um zu erklären. Mein Beispiel ist zu einfach (versucht mein Szenario zu vereinfachen).

Ich verwende es für ein ActionMethodSelectorAttribute in Asp.net MVC, um zu bestimmen, ob beim Auflösen der URL / Route eine Methode verfügbar sein soll.

Ich mache das, indem ich so etwas in der Methode deklariere

<code>[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
    return View();
} 
</code>

Dies würde bedeuten, dass überprüft werden sollte, ob das Formular oder die TempData einen Schlüssel haben, der für die verfügbare Methode angegeben ist.

Die Methoden, die es aufruft (doSomething (), doSomethingElse () und doWhatever () in meinem vorherigen Beispiel), haben tatsächlich bool als Rückgabewert und werden mit einem Parameter aufgerufen (verschiedene Sammlungen, die keine Schnittstelle gemeinsam haben, die es sein kann) gebraucht - siehe mein Beispielcode im Link unten etc).

Um hoffentlich eine bessere Vorstellung davon zu bekommen, was ich tue, habe ich ein einfaches Beispiel eingefügt, was ich tatsächlich auf dem Pastebin tue - es ist hier zu findenhttp://pastebin.com/m478cc2b8

Antworten auf die Frage(8)

Ihre Antwort auf die Frage