在[授权(角色)]上使用枚举[标志]和按位运算符

时间:2017-06-20 14:34:35

标签: c# enums

我正在构建一个ASP.NET MVC 5应用程序,并按照此SO post中的示例将[Flags]应用于enum

[Flags]
public enum Role
{
    User = 1,
    Finance = 2,
    Management = 4,
    SystemAdmin = 8
}

请注意,[Flags]属性为我们提供了一种很好的方法,可以将多个值作为一个以逗号分隔的字符串:

var roles = (Constants.Role.SystemAdmin | Constants.Role.Management).ToString();
// "SystemAdmin, Management"

枚举值将用于控制器和操作的[Authorize]属性,例如:

[Authorize(Roles = (Constants.Role.SystemAdmin | Constants.Role.Management).ToString())] 
public class SomeController : Controller
{ ... }

但是,上述属性会生成此错误:

  

属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

为什么我可以使用.ToString()方法并在代码中获取枚举的CSV,但在[Authorize]属性中使用相同的语句时却不能?

1 个答案:

答案 0 :(得分:6)

因为属性是元数据,所以它们具有初始化必须是常量的限制。正如您的错误所说:

  

属性参数必须是常量表达式

ToString()是一种方法调用,因此无法保证不变。这就是你可以使用它的原因。

要解决此问题,可能能够继承Authorize并执行以下操作:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
     private Role roleEnum;
     public Role RoleEnum
     {
         get { return roleEnum; }
         set { roleEnum = value; base.Roles = value.ToString(); }
     }
}

你可以这样使用:

[MyAuthorize(RoleEnum = Constants.Role.SystemAdmin | Constants.Role.Management)] 

^不需要ToString()