c#名称转换为强类型参数
本文关键字:类型参数 转换 | 更新日期: 2023-09-27 18:18:33
使用实体框架,我有一个名为permissions的实体,它有一组bool
s来指定什么可以做,什么不可以做。
有点像:
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);
我可以用enum来做,并保持两者互为镜像,但这是我想避免的开销-虽然nameof工作,但事实是该方法可以接收任何字符串,因此可以在以后的行中分解。
我将简单地创建一个方法GetPermission
(如果你还没有一个):
Permissions GetPermission(int groupId) { ... }
,然后这样使用:
if (GetPermission(123).ViewRecords) { ... }
这不是我的代码,但我不记得从哪里得到的
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);