2016-11-18 4 views
1

Использование сущности framework, у меня есть объект, называемый разрешениями, который имеет набор bool s, чтобы указать, что можно и чего нельзя сделать.C# nameof в строго типизированный параметр?

Немного как:

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;} 
} 

Вы получаете идею. Каждая группа пользователей имеет один из них, и все это хорошо.

У меня есть класс служб безопасности, который проверяет и проверяет эту информацию против правильной группы и действия - опять же, все работает хорошо - однако у меня остались некоторые магические строки, которые я бы хотел избежать.

Например: public bool HasPermission(int groupId, string action)

Я хотел бы, как: public bool HasPermission(int groupId, Permission action)

На данный момент я использую nameof, так:

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

Однако, есть способ отображения свойства класса, таким образом, это было бы:

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

Я мог бы сделать это с перечислением и поддерживать эти два, чтобы отражать друг друга, но это накладные расходы, которые я бы хотел избежать - и в то время как имя работает, факт заключается в том, что метод может получать любую строку и поэтому может быть разбит позже по линии.

+1

Почему бы не использовать перечисление? Это не так много накладных расходов, и это препятствует тому, чтобы кто-то пропустил неизвестную магическую строку по линии. –

+1

Другим преимуществом перечисления является то, что вы можете сделать его переименованием флагов и достаточно легко проверить наличие нескольких разрешений. – Servy

+0

@ StephenWilson, что я спрашиваю - пока это не массивная накладная работа, я стараюсь свести к минимуму количество изменений, необходимых, когда (неизменно) новое разрешение добавляется позже по строке. Теперь совершенно правильный ответ: «Нет, переименование - это хорошо (tm)». WIth @ Servy указывает на 'flags' (новый для меня там),' Enum' становится более привлекательным! – RemarkLima

ответ

7

Я бы просто создать метод GetPermission (если у вас его еще нет):

Permissions GetPermission(int groupId) { ... } 

, а затем использовать его например:

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

Спасибо, это выглядит намного лучше - я попробую, поскольку мне нужно будет немного реорганизовать, и есть некоторые дополнительные измерения, которые проверяются как часть функции - это группа пользователей, а также организация групповой матрицы, но это могло бы заглушить вопрос! – RemarkLima

+0

В соответствии с комментариями в вопросе, я пошел с «перечислением» для других преимуществ, плюс модель означает, что пользователь может принадлежать нескольким группам (непонятно из вопроса), и разрешения могут быть приняты из любой группы ... Однако это отличный ответ на этот вопрос и отличный способ взглянуть на более простые модели разрешений! – RemarkLima

1

Это не мой код, но я не могу вспомнить, откуда я его получил.

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; 
} 

Вы можете назвать его:

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

Это длинный путь написания nameof (...). Зачем переписывать что-то, что есть на языке C#. Это нормально для версии 5 или старше C#. И я думаю, что Мигель Кастро использовал этот код в одном из своих курсов Pluralsight. –

+0

Это не прямой переписчик nameof(). Он хотел, чтобы дать метод свойство и не писать имяof() вокруг свойства. И, как вы сказали, он работает и в более старых версиях. – Rabban

Смежные вопросы