C# 如何检查枚举数组中是否存在枚举值?
我使用此代码授权用户:C# 如何检查枚举数组中是否存在枚举值?,c#,C#,我使用此代码授权用户: public enum Role { Admin, User } public class AuthorizeRolesAttribute : AuthorizeAttribute { private Role[] _roles; public AuthorizeRolesAttribute(params Role[] roles) { _roles = roles; } protected over
public enum Role {
Admin,
User
}
public class AuthorizeRolesAttribute : AuthorizeAttribute
{
private Role[] _roles;
public AuthorizeRolesAttribute(params Role[] roles)
{
_roles = roles;
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
ClaimsIdentity claimsIdentity;
var httpContext = HttpContext.Current;
if (!(httpContext.User.Identity is ClaimsIdentity))
{
return false;
}
claimsIdentity = httpContext.User.Identity as ClaimsIdentity;
var roleId = claimsIdentity.FindFirst("RoleId");
if (_roles == null)
{
// just extra defense, not sure it should happen
return false;
}
// This line fails
return _roles.Contains(roleId);
}
}
它检查以下各项:
[AuthorizeRoles(Role.Admin, Role.User)]
然而,我感到困惑_roles包含Role类型的数组。roleId是一个代表角色的数字
我与contains的连线失败,出现以下消息:
Error 2 'Entities.Enums.Role[]' does not contain a definition for 'Contains'
and the best extension method overload 'System.Linq.Queryable.Contains<TSource>
(System.Linq.IQueryable<TSource>, TSource)' has some invalid arguments
Error 2“Entities.Enums.Role[]”不包含“Contains”的定义
最好的扩展方法是重载'System.Linq.Queryable.Contains'
(System.Linq.IQueryable,TSource)“”具有一些无效参数
如何将roleId转换为角色类型,以便contains工作?contains方法需要一个枚举值 如果您的roldeId是整数 你可以用
_roles.Contains((Role)roleId);
如果是字符串,则需要使用Enum.Parse
和Enum.IsDefined
方法
以下是一个小片段:
class Program
{
static void Main(string[] args)
{
Role[] _roles;
_roles = new[] {Role.Admin, Role.User};
Console.WriteLine( _roles.Contains((Role)0)); // True
Console.WriteLine(_roles.Contains((Role)1)); // True
Console.WriteLine(_roles.Contains((Role)2)); // False
Role role = (Role)Enum.Parse(typeof (Role), "Admin");
Console.WriteLine(_roles.Contains(role)); // True
}
public enum Role
{
Admin,
User,
Guest
}
}
希望这有帮助contains方法需要枚举值 如果您的roldeId是整数 你可以用
_roles.Contains((Role)roleId);
如果是字符串,则需要使用Enum.Parse
和Enum.IsDefined
方法
以下是一个小片段:
class Program
{
static void Main(string[] args)
{
Role[] _roles;
_roles = new[] {Role.Admin, Role.User};
Console.WriteLine( _roles.Contains((Role)0)); // True
Console.WriteLine(_roles.Contains((Role)1)); // True
Console.WriteLine(_roles.Contains((Role)2)); // False
Role role = (Role)Enum.Parse(typeof (Role), "Admin");
Console.WriteLine(_roles.Contains(role)); // True
}
public enum Role
{
Admin,
User,
Guest
}
}
希望这对您有所帮助如果您的id是字符串,您可以这样写:
var roleId = "Admin";
var roleEnum = (Role)Enum.Parse(typeof(Role), roleId);
return _roles.Contains(roleEnum);
如果您的id是字符串,则可以这样编写:
var roleId = "Admin";
var roleEnum = (Role)Enum.Parse(typeof(Role), roleId);
return _roles.Contains(roleEnum);
FindFirst()
返回类型为Claim
,而不是int
的对象。检查这是否有帮助:FindFirst()
返回类型为Claim
,而不是int
的对象。检查这是否有帮助:它是字符串吗?它是Claim
。See.Claim.Value是根据您发布的链接声明的字符串值,那么它是一个字符串吗?它是一个声明
。See.Claim.Value是根据您发布的链接声明的字符串值