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工作,但事实是该方法可以接收任何字符串,因此可以在以后的行中分解。

c#名称转换为强类型参数

我将简单地创建一个方法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);