Quantcast
Channel: Entwicklung – HanseVision Blog
Viewing all articles
Browse latest Browse all 46

Aus der Praxis – Flags Enum Werte komfortabel abfragen

$
0
0

Schon seit .NET 2.0 gibt es das FlagsAttribute. Damit ist es möglich Enums zu bauen, die eine Kombination aus mehreren Werten erlauben, da die Werte als Bitflags gespeichert werden:

[Flags]
public enum UserRights
{
    None = 0,
    Read = 1,
    Update = 2,
    Delete = 4,
    Create = 8,
}

Setzen

Diesem Beispiel folgend können die Rechte eines Benutzers, der Lesen, Erstellen und Ändern darf, so gespeichert werden:

UserRights rights = UserRights.Read | UserRights.Update | UserRights.Create;

Die Werte (1, 2 und 8) werden hierbei mit einem bitweisen ODER verbunden, es ergibt sich also binär:

0001 |
0010 |
1000 =
1011

Abfragen

Um nun zu prüfen, ob der Benutzer das Recht Ändern (= Update) hat, musste bis .NET 4.0 auf folgende unschöne Abfrage zurückgegriffen werden:

if ( (rights & UserRights.Update) == UserRights.Update ) { /* Benutzer hat das Recht Ändern */ }

Was passiert hier binär? Das bitweise UND wirkt wie eine Bitmaske, die nur das gefilterte Bitflag durchlässt:

1011 &
0010 =
0010

Seit .NET 4.0 gibt es einen hübscheren Weg, nämlich die Methode Enum.HasFlag:

if ( rights.HasFlag(UserRights.Update) ) { /* Benutzer hat das Recht Ändern */ }

Intern passiert hier natürlich das gleiche, wie zuvor erklärt.

Problematik

Schreiben wir aber eine Lösung für SharePoint 2010, benutzen wir .NET 3.5 und haben diese Methode somit nicht. Desweiteren kann es sein, dass der Enum nicht durch uns definiert wird, sondern durch eine Bibliothek oder einen Dienst vorgegeben ist. Was nun?

Die Lösung

Hier kann mit ein paar Zeilen abgeholfen werden, indem wir eine Extension Method bauen, z.B. so:

public static class UserRightsExtension
{
    public static bool HasFlag(this UserRights data, UserRights flag)
    {
        return (data & flag) == flag;
    }
}

Nun können wir auf UserRights wie unter .NET 4.0 zugreifen.


Viewing all articles
Browse latest Browse all 46