【问题标题】:How can I check for the existance of an enum value in an array of Enums?如何检查枚举数组中是否存在枚举值?
【发布时间】:2015-02-12 19:39:26
【问题描述】:

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

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 包含一个角色类型的数组。而 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 转换为 Role 类型以便包含工作?

【问题讨论】:

标签: c#


【解决方案1】:

contains 方法需要一个枚举值

如果你的 roldeId 是一个整数。

你可以使用

 _roles.Contains((Role)roleId);

如果是字符串,则需要使用 Enum.ParseEnum.IsDefined 方法。

这是一个小sn-p:

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
    }
}

希望对你有帮助

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 2013-03-12
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多