C#nameof为强类型参数?

时间:2016-11-18 16:17:47

标签: c# entity-framework

使用实体框架,我有一个名为权限的实体,它有一组bool来指定可以做什么和不能做什么。

有点像:

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

你明白了。每个用户组都有其中一个,这一切都很好。

我有一个安全服务类,它根据正确的组和行动验证和检查这些信息 - 再次,一切运作良好 - 但是我留下了一些我想避免的魔术字符串。< / p>

例如: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);

我可以使用枚举,并保持两者互相镜像,但这是一个我想避免的开销 - 虽然名称的工作,事实是该方法可以接收任何字符串,因此可能会在以后打破。

2 个答案:

答案 0 :(得分:7)

我只是创建一个方法GetPermission(如果你还没有方法):

Permissions GetPermission(int groupId) { ... }

然后像这样使用它:

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

答案 1 :(得分: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);