如何检查枚举数组中是否存在枚举值?

时间:2014-12-14 16:58:55

标签: c#

我有这个代码来授权用户:

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是一个代表角色的数字。

我的包含内容的行已失败,显示此消息:

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

我怎样才能将roleId转换为一种角色,以便包含有效?

2 个答案:

答案 0 :(得分:5)

contains方法需要枚举值

如果你的roldeId是一个整数。

您可以使用

 _roles.Contains((Role)roleId);

如果是字符串,则需要使用Enum.ParseEnum.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
    }
}

希望这有帮助

答案 1 :(得分:0)

如果你的id是一个字符串,你可以这样写:

var roleId = "Admin";
var roleEnum = (Role)Enum.Parse(typeof(Role), roleId);
return _roles.Contains(roleEnum);