2008-08-28 16 views
9

In C# gibt es eine Kurzform schreiben:Stenografie bedingt in C# ähnlich wie SQL 'in' Schlüsselwort

public static bool IsAllowed(int userID) 
{ 
    return (userID == Personnel.JohnDoe || userID == Personnel.JaneDoe ...); 
} 

Like:

public static bool IsAllowed(int userID) 
{ 
    return (userID in Personnel.JohnDoe, Personnel.JaneDoe ...); 
} 

Ich weiß, dass ich auch Schalter verwenden könnte, aber Es gibt wahrscheinlich 50 oder so Funktionen, die ich schreiben muss (Portierung einer klassischen ASP-Seite auf ASP.NET), also möchte ich sie so kurz wie möglich halten.

Antwort

13

Wie wäre es damit?

public static class Extensions 
{ 
    public static bool In<T>(this T testValue, params T[] values) 
    { 
     return values.Contains(testValue); 
    } 
} 

Verbrauch:

Personnel userId = Personnel.JohnDoe; 

if (userId.In(Personnel.JohnDoe, Personnel.JaneDoe)) 
{ 
    // Do something 
} 

Ich kann nicht Kredit für diese Behauptung, aber ich kann auch nicht erinnern, wo ich es sah. Also, Kredit an Sie, anonymer Internet-Fremder.

+0

das ist wunderschön! – amrtn

2

Ich würde die Liste der zulässigen IDs als Daten nicht Code kapseln. Dann kann die Quelle später einfach geändert werden.

List<int> allowedIDs = ...; 

public bool IsAllowed(int userID) 
{ 
    return allowedIDs.Contains(userID); 
} 

.NET 3.5, können Sie IEnumerable statt List dank Erweiterungsmethoden Bei der Verwendung.

(Diese Funktion sollte nicht statisch sein diesen Beitrag. Siehe:. using too much static bad or good ?)

4

Wie wäre es damit so etwas wie:

public static bool IsAllowed(int userID) { 
    List<int> IDs = new List<string> { 1,2,3,4,5 }; 
    return IDs.Contains(userID); 
} 

(Sie könnten natürlich die statische Status ändern, initialisieren die IDs Verwenden Sie ein IEnumerable <>, usw., basierend auf Ihren Bedürfnissen. Der Hauptpunkt ist, dass das am nächsten zum in Operator in SQL ist die Collection.Contains() -Funktion.)

1

Sind Berechtigungen Benutzer-ID basiert? Wenn dies der Fall ist, erhalten Sie möglicherweise eine bessere Lösung, indem Sie zu rollenbasierten Berechtigungen wechseln. Möglicherweise müssen Sie diese Methode auch relativ häufig bearbeiten, um weitere Benutzer zur Liste "Erlaubte Benutzer" hinzuzufügen.

Zum Beispiel Enum Userrole { Benutzer, Administrator, LordEmperor }

class User { 
    public UserRole Role{get; set;} 
    public string Name {get; set;} 
    public int UserId {get; set;} 
} 

public static bool IsAllowed(User user) { 
    return user.Role == UserRole.LordEmperor; 
} 
+0

Ich würde gerne tun, aber wir sind leider viel zu tief mit Legacy-Code. – Marshall

0

Ein netter kleiner Trick ist, die Art und Weisen Sie in der Regel verwenden .Contains(), um eine Art umgekehrten, wie: -

public static bool IsAllowed(int userID) { 
    return new int[] { Personnel.JaneDoe, Personnel.JohnDoe }.Contains(userID); 
} 

Hier können Sie so viele Einträge in das Array einfügen, wie Sie möchten.

Wenn die Personnel.x ist ein Enum Sie einige Casting Probleme damit haben würden (und mit dem ursprünglichen Code, den Sie geschrieben), und in diesem Fall wäre es einfacher zu bedienen: -

public static bool IsAllowed(int userID) { 
    return Enum.IsDefined(typeof(Personnel), userID); 
} 
0

Hier in der Nähe, die ich mir vorstellen kann:

using System.Linq; 
public static bool IsAllowed(int userID) 
{ 
    return new Personnel[] 
     { Personnel.JohnDoe, Personnel.JaneDoe }.Contains((Personnel)userID); 
} 
0

Just another Syntax Idee:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID); 
0

können Sie ein iter schreiben Mitarbeiter für Personal.

public static bool IsAllowed(int userID) 
{ 
    return (Personnel.Contains(userID)) 
} 

public bool Contains(int userID) : extends Personnel (i think that is how it is written) 
{ 
    foreach (int id in Personnel) 
     if (id == userid) 
      return true; 
    return false; 
}