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是根据您发布的链接声明的字符串值