【发布时间】:2019-04-17 12:06:45
【问题描述】:
我试图让授权接受角色作为枚举或smart enum 这样我就不必调试魔术字符串及其拼写错误
但我一直因为这两个错误而陷入死胡同:
属性构造函数参数“roles”的类型为“Role[]”,它不是有效的属性参数类型
属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式
这是我的代码:
AuthorizeRoles.cs
public class AuthorizeRoles : AuthorizeAttribute
{
public AuthorizeRoles(params Role[] roles)
{
string allowed = string.Join(", ", roles.ToList().Select(x => x.Name));
Roles = allowed;
}
}
Role.cs
public class Role
{
public readonly string Name;
public enum MyEnum // added
{
Admin,
Manager
}
public static readonly Role Admin = new Role("Admin");
public static readonly Role Manager = new Role("Manager");
public Role(string name)
{
Name = name;
}
public override string ToString()
{
return Name;
}
在我的控制器内部我做了这个
[AuthorizeRoles(Role.Admin, Role.Manager)]
[AuthorizeRoles(Role.MyEnum.Admin)] // added
public IActionResult Index()
{
return Content("hello world");
}
我已经看过这些答案,但它不起作用
【问题讨论】:
-
@SᴇM 一开始是,后来我改成了smart-enum
-
你的 smart-enum 不是一个枚举,所以这不起作用。使用真正的枚举就可以了。
-
属性不能这样做,你需要编译器说的常量表达式。枚举或字符串可能是您最好的选择。
-
你仍然可以引用事物,你可以做类似
[AuthorizeRole(typeof(Role), nameof(Role.Admin))]的事情,你需要使用反射来获取实际的字段或属性值。 -
@thehennyy 我已经用枚举完成了,仍然发生同样的问题
标签: c# asp.net asp.net-core asp.net-core-mvc