Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Byte Enum flags aktiviert beim Setzen von allen Flags nur einen Teil
filmee24
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

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

beantworten | zitieren | melden

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
C. Anders

Moderationshinweis von Coffeebean (08.09.2015 - 13:00:23):

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

private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2354

beantworten | zitieren | melden

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).
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von inflames2k am .
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 697
Herkunft: OWL

beantworten | zitieren | melden

Bei ViewCourses gäbe es bereits das erste Problem, da 0x03 = 0x01 | 0x02 ist.
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 966

beantworten | zitieren | melden

Außerdem: Bist du dir sicher dass du nach 0x09 die 0x10 definieren willst?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von witte am .
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1044
Herkunft: Mainz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15967

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4092

beantworten | zitieren | melden

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!
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
filmee24
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

beantworten | zitieren | melden

Danke,

hat alles funktioniert, mit dem anderen RoleManager.

Hab vorher nie ein RoleSystem gebraucht, deswegen kannte ich des noch nicht
C. Anders
private Nachricht | Beiträge des Benutzers