在您的情况下,答案是,不,您不能那样做。 IPrincipal.IsInRole 接受字符串,而不是枚举值。
要解决您的问题,您需要使用逻辑或运算符,并像这样重组调用:
IsInRole(RoleEnum.Administrator) || IsInRole(RoleEnum.Moderator)
(假设RoleEnum 中的值是字符串。如果不是,请参阅末尾了解更多信息。)
那么| 运算符是做什么的?它是按位或运算符。假设我们有两个二进制数0100 和0010。 or 运算符通过查看每个位的位置来组合它们,如果其中一个(或两个)为 1,则结果中的相同位置为 1。对于其上方的两个数字
0100 |
0010 =
0110
现代处理器内置了许多此类运算符,因此这些运算速度非常快。
对于枚举,C# 还允许您指定Flags 属性,该属性表示枚举的每个成员默认情况下代表值的数字表示中的单个位。这允许快速组合和测试标志,并允许在单个标准int 中存储 32 个值。这是因为所有枚举的内部类型都是核心数字类型之一。
如果RoleEnum 中的值不是字符串,而是实际的enum 类型,则需要进行一些修改。为了争论,让我们这样定义RoleEnum:
[Flags]
public enum RoleEnum
{
Administrator,
Moderator,
User,
Guest,
}
假设您有一个函数需要检查用户是否具有多个角色之一。它可能看起来像这样:
public bool IsInAnyRole(RoleEnum userRoles)
{
bool ok = false;
if (userRoles.HasFlag(RoleEnum.Administrator))
{
ok |= IsInRole("Administrator");
}
if (userRoles.HasFlag(RoleEnum.Moderator))
{
ok |= IsInRole("Moderator");
}
if (userRoles.HasFlag(RoleEnum.User))
{
ok |= IsInRole("User");
}
if (userRoles.HasFlag(RoleEnum.Guest))
{
ok |= IsInRole("Guest");
}
return ok;
}
(将|= 更改为&= 会将函数更改为IsInAllRoles)
然后可以调用为
bool inRole = IsInAnyRole(RoleEnum.Administrator | RoleEnum.Moderator);