我正在构建一个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]
属性中使用相同的语句时却不能?
答案 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()