我有这种情况,用户有自己的角色
保管人和财务部门都是超级用户NormalUser
护法
金融
如何检查角色保管人是否为超级用户
这是我的示例代码..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
public enum Role
{
NormalUser = 0,
Custodian = 1,
Finance = 2,
SuperUser = Custodian | Finance,
All = Custodian | Finance | NormalUser
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Normal: " + Convert.ToInt32(Role.NormalUser));
Console.WriteLine("Custodian: " + Convert.ToInt32(Role.Custodian));
Console.WriteLine("Finance: " + Convert.ToInt32(Role.Finance));
Console.WriteLine("SuperUser: " + Convert.ToInt32(Role.SuperUser));
Console.WriteLine("All: " + Convert.ToInt32(Role.All));
Console.WriteLine();
Console.WriteLine("Normal User is in All: {0}", Role.NormalUser == Role.All);
Console.WriteLine("Normal User is not a SuperUser: {0}", Role.NormalUser != Role.SuperUser);
Console.WriteLine("Normal User is not a Custodian: {0}", Role.NormalUser != Role.Custodian);
Console.WriteLine();
Console.WriteLine("Custodian is in All: {0}", Role.Custodian == Role.All);
Console.WriteLine("Custodian is a SuperUser: {0}", Role.Custodian == Role.SuperUser);
Console.WriteLine("Custodian is a NormalUser: {0}", Role.Custodian == Role.NormalUser);
Console.WriteLine();
Console.WriteLine("Finance is in All: {0}", Role.Finance == Role.All);
Console.WriteLine("Finance is a SuperUser: {0}", Role.Finance == Role.SuperUser);
Console.WriteLine("Finance is a NormalUser: {0}", Role.Finance == Role.NormalUser);
Console.ReadLine();
}
}
}
如果我们运行它就是结果
Normal: 0
Custodian: 1
Finance: 2
SuperUser: 3
All: 3
Normal User is in All: False
Normal User is not a SuperUser: True
Normal User is not a Custodian: True
Custodian is in All: False
Custodian is a SuperUser: False
Custodian is a NormalUser: False
Finance is in All: False
Finance is a SuperUser: False
Finance is a NormalUser: False
我期待着
保管人在All:True ,
托管人是SuperUser:True ,
财务处于全部:真实 ,
财务是超级用户:真实 ,
普通用户处于全部:True
答案 0 :(得分:30)
Enum.HasFlag是您想要使用的
Console.WriteLine("Custodian is in All: {0}", Role.All.HasFlag(Role.Custodian));
注意到你的枚举应该像Flags属性一样定义,值的间隔为2的幂
[Flags]
public enum Role
{
NormalUser = 1,
Custodian = 2,
Finance = 4,
SuperUser = Custodian | Finance,
All = Custodian | Finance | NormalUser
}
2的幂用于标记枚举的原因是每个2的幂表示在二进制表示中设置的唯一位:
NormalUser = 1 = 00000001
Custodian = 2 = 00000010
Finance = 4 = 00000100
Other = 8 = 00001000
因为枚举中的每个项都有一个唯一的位设置,所以可以通过设置它们各自的位来组合它们。
SuperUser = 6 = 00000110 = Custodian + Finance
All = 7 = 00000111 = NormalUser + Custodian + Finance
NormOther = 9 = 00001001 = NormalUser + Other
注意二进制形式中的每个1如何与上面部分中为该标志设置的位排列。
答案 1 :(得分:9)
查看What does the [Flags] Enum Attribute mean in C#?以获得更详尽的解释。
声明标志的“更安全”的方法是使用位移来确保没有重叠(如@DaveOwen's answer所述)而不自己计算出数学:
[Flags]
public enum MyEnum
{
None = 0,
First = 1 << 0,
Second = 1 << 1,
Third = 1 << 2,
Fourth = 1 << 3
}
还有Enum.HasFlag
(可能比OP更新的.NET)进行检查,而不是Expected & Testing == Expected
答案 2 :(得分:2)
我认为这可能与How do you pass multiple enum values in C#?
重复&amp;位掩码可以做到这一点。
((Role.NormalUser & Role.All) == Role.NormalUser)
仔细观察,您将获得以下信息:
0b0 & 0b11 == 0b0
但是,如果您想要检查超级用户是否在融资中,您将获得以下内容:
((Role.SuperUser & Role.Finance) == Role.Finance)
这将评估为:
0b11 & 0b10 == 0b10
答案 3 :(得分:1)
您可以将标志属性添加到枚举
[Flags]
public enum Role
{
NormalUser,
Custodian,
Finance,
SuperUser = Custodian | Finance,
All = Custodian | Finance | NormalUser
}
然后您可以使用此表达式检查角色:
Role testRole = Role.Finance
if(testRole & Role.SuperUser == Role.SuperUser){
//testRole is SuperUser
}