使用实体框架,我有一个名为权限的实体,它有一组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);
我可以使用枚举,并保持两者互相镜像,但这是一个我想避免的开销 - 虽然名称的工作,事实是该方法可以接收任何字符串,因此可能会在以后打破。
答案 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);