Laden...

Byte Enum flags aktiviert beim Setzen von allen Flags nur einen Teil

Erstellt von filmee24 vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.703 Views
F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 8 Jahren
Byte Enum flags aktiviert beim Setzen von allen Flags nur einen Teil

Hi,

ich hab eine große Enum:


[Flags]
    public enum Right : byte
    {
        AddCourse = 0x01,
        EditCourse = 0x02,
        ViewCourses = 0x03,
        RemoveCourse = 0x04,

        AddAppointment = 0x05,
        EditAppointment = 0x06,
        ViewAppointments = 0x07,
        RemoveAppointment = 0x08,

        AddCustomer = 0x09,
        EditCustomer= 0x10,
        ViewCustomers = 0x11,
        RemoveCustomer = 0x12,

        AddFile = 0x13,
        ViewFiles = 0x14,
        RemoveFile = 0x15,
        ExportFile = 0x16,

        AddUser = 0x17,
        EditUser = 0x18,
        ViewUsers = 0x19,
        RemoveUser = 0x20,

        ViewSettings = 0x21,
        EditSettings = 0x22
    }

wenn ich alle flags setze:


(Right.AddAppointment | Right.AddCourse | Right.AddCustomer | Right.AddFile | Right.AddUser 
                    | Right.EditAppointment | Right.EditCourse | Right.EditCustomer | Right.EditSettings | 
                    Right.EditUser | Right.ExportFile | Right.RemoveAppointment | Right.RemoveCourse | 
                    Right.RemoveCustomer | Right.RemoveFile | Right.RemoveUser | Right.ViewAppointments | 
                    Right.ViewCourses | Right.ViewCustomers | Right.ViewFiles |
                    Right.ViewSettings | Right.ViewUsers)

dann sind aber nur 3 werte dem user zugeordnet.

Wie könnte ich das Problem beheben?

MFG

Hinweis von Coffeebean vor 8 Jahren

Ich hab mal den Titel angepasst. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3. Falls du was besseres hast, dann editier ihn bitte nochmal. Jedenfalls ist "Enum flags funktioniert nicht richtig" keine Problembeschreibung, sowie "geht nicht" auch keine Fehlermeldung ist

C. Anders

2.298 Beiträge seit 2010
vor 8 Jahren

Zualler erst einmal solltest du den Range der Flag-Werte ändern. Durch die Kombination von

AddCourse = 0x01,
EditCourse = 0x02,
ViewCourses = 0x03,

gibt es den Wert 6 -> EditAppointment = 0x06

Kann mir nicht vorstellen dass das dein Vorhaben war. Also Besser: Flag-Wert pro Eintrag verdoppeln.
1 -> 2 -> 4 -> 8 -> 16 Ansonsten kommt es zu ungewollten Überschneidungen, da es dann aber bis 2097152 geht musst du auch den Typ des Enums ändern (z.B. auf int).

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

709 Beiträge seit 2008
vor 8 Jahren

Bei ViewCourses gäbe es bereits das erste Problem, da 0x03 = 0x01 | 0x02 ist.

W
955 Beiträge seit 2010
vor 8 Jahren

Außerdem: Bist du dir sicher dass du nach 0x09 die 0x10 definieren willst?

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

um das Ganze mal etwas zusammenzufassen:

  1. Deine Nummerierung der Flags funktioniert nicht, weil die bitweisen Operatoren später nur Mist liefern würden (siehe Designing Flags Enumerations)

  2. Deine Nummerierung der Flags funktioniert nicht, weil du hexadezimale Schreibweise verwendest - jedoch nicht entsprechend durchnummerierst 0x10 sollte hier nämlich z.B. 0x0A heißen etc. pp.

  3. Ich würde mir an deiner Stelle gut überlegen, ob du für ein Rechtesystem wirklich eine Flags-Enumeration verwenden solltest... Es gibt so viele schöne Technologien für Rechteverwaltung... Warum so?

LG

16.807 Beiträge seit 2008
vor 8 Jahren

Letzterer Satz von Taipi88 is der wichtigste: so baut man heutzutage keine Rechtesysteme auf.
Das erinnert mich stark an die 90er Jahre als Rollenbasierte Konzepte noch Wunschdenken waren und damals oft verwendete, schmutzige Umsetzungen.

3.003 Beiträge seit 2006
vor 8 Jahren

Mehr zum lesen:

https://msdn.microsoft.com/en-us/library/shz8h065(v=vs.110).aspx (dort die Links beachten, ist ne Menge Lesestoff)

Flag-basiertes Rechtemanagement kann zwar funktionieren, aber dafür muss man schon bewusst auf die durchdachten und durchstrukturierten Alternativen des Frameworks verzichten UND genau wissen, was man tut.
Beides scheint mir, sorry für die Offenheit, bei dir nicht gegeben.

Dich in ein existierendes Rechtekonzept einzulesen, dürfte dich weiterbringen, als Rechteverwaltung selbst neu erfinden zu wollen 😃.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

P
157 Beiträge seit 2014
vor 8 Jahren

Hallo,

also erstmal die Lösung deines Problems :

0x0-F sind Hexadezimalwerte...wenn du Flags definieren möchtest und nicht die Zahlenwerte der entsprechenden Bitmuster reinklamüsern möchtest benutze die folgende Schreibweise:

public enum FlagEnum
{
    None = 0,

    Flag1 = 1 << 0,

    Flag2 = 1 << 1,

    Flag3 = 1 << 2,

    Flag4 = 1 << 3,
}

1 << 0 = 0
1 << 1 = 1
1 << 2 = 2
1 << 3 = 4

Das sagt: verschiebe das 1. bit (Wert 1 ist immer bit 1 gesetzt alle anderen 0) um n stellen nach links...findest du im internet unter dem Begriff: bit-shift. wichtig ist das nicht >> verwendet wird...das geht nur auf prozessoren die das intel-byte format verwenden...apple macht es glaub ich anders rum.

Abfragen kannst du das ganze mit Enum.HasFlag(...)

Das Flags - Attribut benötigst du dafür nicht, das hat einen anderen Zweck.

Aber wie schon oben geschrieben wurde, ist ein Rechtesystem damit doch sehr eingeschränkt, du wirst merken das 64 bit zu wenig sind -mehr kannst du momentan nicht adressieren, jedenfalls nicht mit den Handelsüblichen prozessoren und compilern. Für einfache Anwendungsfälle, wo es nicht mehr als 64 Rechte gibt kann man sowas als Tüftellösung verwenden. Für größere Sachen finden sich bessere Lösungen. Es ist auf jeden Fall die perfomanteste aller Lösungen, da bit-operationen die schnellsten operationen auf deinem Prozessor sind - schneller gehts also nicht mehr 😉

vg

Wenn's zum weinen nicht reicht, lach drüber!

4.931 Beiträge seit 2008
vor 8 Jahren

Aber wenn dann richtig hinschreiben (und erklären):


1 << 0 = 1
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8

😉

Und deine beiden Sätze bzgl. "intel-byte format" und "Flags - Attribut" sind (leider) kompletter Humbug!

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 8 Jahren

Danke,

hat alles funktioniert, mit dem anderen RoleManager.

Hab vorher nie ein RoleSystem gebraucht, deswegen kannte ich des noch nicht

C. Anders