2016-11-18 2 views
1

Mit Entity-Framework habe ich eine Entität namens Berechtigungen, die eine Reihe von bool s hat, um anzugeben, was kann und was nicht getan werden kann.C# nameof in stark typisierten Parameter?

Ein bisschen wie:

public class Permissions 
{ 
    public int Id {get;set;} 
    public int GroupId {get;set;} 
    public bool ViewRecords {get;set;} 
    public bool EditRecords {get;set;} 
    public bool DeleteRecords {get;set;} 
    public bool CreateRecords {get;set;} 
    public bool CreateSubGroups {get;set;} 
} 

Sie erhalten die Idee. Jede Benutzergruppe hat eine davon und das ist alles gut.

Ich habe eine Sicherheitsdienste-Klasse, die diese Informationen gegen die richtige Gruppe und Aktion validiert und überprüft - wieder, alles funktioniert gut - aber ich bin mit einigen magischen Zeichenfolgen, die ich gerne vermeiden würde.

Zum Beispiel: public bool HasPermission(int groupId, string action)

Ich möchte als: public bool HasPermission(int groupId, Permission action)

Im Moment bin ich nameof verwenden, so:

bool go = HasPermission(123, nameof(Permission.ViewRecords)); 

Allerdings gibt es eine Möglichkeit zur Karte die Klasseneigenschaften wären also:

bool go = HasPermission(123, Permission.ViewRecords); 

Ich könnte es mit einem Enum machen, und die beiden beibehalten, um sich gegenseitig zu spiegeln, aber das ist ein Overhead, den ich gerne vermeiden würde - und während der Name funktioniert, ist die Tatsache, dass die Methode jede Saite empfangen kann und daher später gebrochen werden könnte auf der ganzen Linie.

+1

Warum nicht eine Enum verwenden? Es ist nicht so viel Overhead und es verhindert, dass es von jemandem gebrochen wird, der eine unbekannte magische Schnur entlang der Linie passiert. –

+1

Der andere Vorteil einer Enumeration besteht darin, dass Sie sie zu einem Flags-Enum machen können und auf einfache Weise nach mehreren Berechtigungen suchen können. – Servy

+0

@ StephenWilson das ist wy Ich frage - während es nicht einen massiven Overhead ist versuche ich, die Anzahl der erforderlichen Änderungen zu minimieren, wenn (unweigerlich) eine neue Erlaubnis später hinzugefügt wird. Jetzt ist eine vollkommen gültige Antwort nur das - "Nein, ein Enum ist eine gute Sache (tm)". Mit @ Servy Punkt über 'Flags' (neue für mich dort), ein 'Enum' wird zwingender! – RemarkLima

Antwort

7

Ich würde einfach eine Methode GetPermission erstellen (wenn Sie nicht noch haben leider):

Permissions GetPermission(int groupId) { ... } 

und dann verwenden, wie folgt:

if (GetPermission(123).ViewRecords) { ... } 
+0

Danke, das sieht ziemlich besser aus - ich probiere es aus, da ich ein bisschen umgestalten muss und da einige zusätzliche Dimensionen als Teil der Funktion überprüft werden - es ist eine Benutzergruppe sowie eine Organisation Gruppenmatrix, aber das hätte die Frage verdüstert! – RemarkLima

+0

Laut den Kommentaren in der Frage, habe ich mit einem 'enum' für die anderen Vorteile gegangen, und das Modell bedeutet, dass ein Benutzer zu mehreren Gruppen gehören kann (nicht klar aus der Frage jedoch), und die Berechtigungen können genommen werden aus jeder Gruppe ... Dies ist jedoch eine großartige Antwort auf die Frage und eine gute Möglichkeit, einfachere Berechtigungsmodelle zu sehen! – RemarkLima

1

Das ist nicht mein Code, aber ich kann mich nicht erinnern, von wo ich es bekommen habe.

public bool HasPermission(int groupId, Expression<Func<T>> propertySelector) 
{ 
    if (propertyExpresssion == null) 
    { 
     throw new ArgumentNullException("propertyExpresssion"); 
    } 

    var memberExpression = propertyExpresssion.Body as MemberExpression; 
    if (memberExpression == null) 
    { 
     throw new ArgumentException("The expression is not a member access expression.", "propertyExpresssion"); 
    } 

    var property = memberExpression.Member as PropertyInfo; 
    if (property == null) 
    { 
     throw new ArgumentException("The member access expression does not access a property.", "propertyExpresssion"); 
    } 

    var getMethod = property.GetGetMethod(true); 
    if (getMethod.IsStatic) 
    { 
     throw new ArgumentException("The referenced property is a static property.", "propertyExpresssion"); 
    } 

    var name = memberExpression.Member.Name; 
} 

Sie können es mit nennen:

bool go = HasPermission(123,() => Permission.ViewRecords); 
+0

Dies ist nur ein langer Weg, Namen zu schreiben (...). Warum etwas neu schreiben, das in der C# -Sprache ist. Dies ist in Ordnung für Version 5 oder älter von C#. Und ich glaube, Miguel Castro hat diesen Code in einem seiner Pluralsight-Kurse verwendet. –

+0

Dies ist kein direktes Umschreiben von nameof(). Er wollte eine Methode, um einer Methode eine Eigenschaft zu geben, und nicht name() um die Eigenschaft schreiben. Und wie Sie gesagt haben, funktioniert es auch in älteren Versionen. – Rabban

Verwandte Themen