Manchmal sehe ich beim Lesen des C # -Codes anderer eine Methode, die mehrere Aufzählungswerte in einem einzelnen Parameter akzeptiert. Ich fand es immer ordentlich, habe es aber nie untersucht.
Nun, jetzt denke ich, dass ich vielleicht ein Bedürfnis danach habe, aber ich weiß nicht wie
- Richten Sie die Methodensignatur ein, um dies zu akzeptieren
- arbeite mit den Werten in der Methode
- Definieren Sie die Aufzählung
um so etwas zu erreichen.
In meiner speziellen Situation möchte ich das System.DayOfWeek verwenden, das definiert ist als:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Ich möchte einen oder mehrere der DayOfWeek-Werte an meine Methode übergeben können. Kann ich diese bestimmte Aufzählung so verwenden, wie sie ist? Wie mache ich die 3 oben aufgeführten Dinge?
Antworten:
Wenn Sie die Aufzählung definieren, ordnen Sie sie einfach [Flags] zu, setzen Sie Werte auf Zweierpotenzen, und es funktioniert auf diese Weise.
Es ändert sich nichts anderes, als mehrere Werte an eine Funktion zu übergeben.
Beispielsweise:
Weitere Informationen finden Sie in der Dokumentation zu MSDN zu Aufzählungstypen .
Bearbeiten als Antwort auf Ergänzungen zur Frage.
Sie können diese Aufzählung nicht unverändert verwenden, es sei denn, Sie möchten sie beispielsweise als Array / collection / params-Array übergeben. Damit können Sie mehrere Werte übergeben. Die Flags-Syntax erfordert, dass die Aufzählung als Flags angegeben wird (oder dass die Sprache auf eine Weise bastardisiert wird, die nicht entworfen wurde).
quelle
Ich denke, die elegantere Lösung ist die Verwendung von HasFlag ():
quelle
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Ich stimme Reeds Antwort zu. Beim Erstellen der Aufzählung müssen Sie jedoch die Werte für jedes Aufzählungselement angeben, damit eine Art Bitfeld entsteht. Beispielsweise:
quelle
Sie können System.DayOfWeek nicht als
[Flags]
Aufzählung verwenden, da Sie keine Kontrolle darüber haben. Wenn Sie eine Methode haben möchten, die mehrere akzeptiert, müssenDayOfWeek
Sie dasparams
Schlüsselwort verwendenAndernfalls können Sie Ihre eigene
[Flags]
Aufzählung erstellen, wie von zahlreichen anderen Respondern beschrieben, und bitweise Vergleiche verwenden.quelle
Sie müssen die Zahlen angeben und sie wie folgt erhöhen, da die Werte bitweise gespeichert werden.
Definieren Sie dann einfach Ihre Methode, um diese Aufzählung zu erstellen
und um es zu nennen, mache so etwas
Um zu überprüfen, ob einer der Enum-Werte enthalten war, überprüfen Sie sie mit bitweisen Operationen wie
quelle
Rufen Sie die Methode in diesem Format auf
MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
Implementieren Sie eine EnumToArray-Methode, um die Optionen zu übergeben
quelle
Markieren Sie Ihre Aufzählung mit dem Attribut [Flags]. Stellen Sie außerdem sicher, dass sich alle Ihre Werte gegenseitig ausschließen (zwei Werte können nicht gleich einem anderen sein), wie z. B. 1,2,4,8,16,32,64 in Ihrem Fall
Wenn Sie eine Methode haben, die eine DayOfWeek-Enumeration akzeptiert, verwenden Sie den bitweisen Operator (|), um mehrere Elemente zusammen zu verwenden. Beispielsweise:
Um zu überprüfen , ob der Parameter ein bestimmtes Element enthält, verwenden Sie das bitweise und Operator (&) mit dem Element , für den Sie überprüfen.
quelle
Reed Copsey ist korrekt und ich würde den ursprünglichen Beitrag ergänzen, wenn ich könnte, aber ich kann nicht, also muss ich stattdessen antworten.
Es ist gefährlich, [Flags] nur für eine alte Aufzählung zu verwenden. Ich glaube, Sie müssen die Enum-Werte explizit in Zweierpotenzen ändern, wenn Sie Flags verwenden, um Konflikte in den Werten zu vermeiden. Siehe die Richtlinien für FlagsAttribute und Enum .
quelle
Mit Hilfe der geposteten Antworten und diesen:
Ich habe das Gefühl, dass ich es ziemlich gut verstehe.
Vielen Dank.
quelle
Etwas in dieser Art sollte zeigen, wonach Sie suchen:
quelle