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
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
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 |
Bei ViewCourses gäbe es bereits das erste Problem, da 0x03 = 0x01 | 0x02 ist.
Außerdem: Bist du dir sicher dass du nach 0x09 die 0x10 definieren willst?
Hi,
um das Ganze mal etwas zusammenzufassen:
Deine Nummerierung der Flags funktioniert nicht, weil die bitweisen Operatoren später nur Mist liefern würden (siehe Designing Flags Enumerations)
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.
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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)
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!
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!
Danke,
hat alles funktioniert, mit dem anderen RoleManager.
Hab vorher nie ein RoleSystem gebraucht, deswegen kannte ich des noch nicht
C. Anders