gpt4 book ai didi

c# - 结合枚举值和位标志

转载 作者:可可西里 更新时间:2023-11-01 08:50:35 26 4
gpt4 key购买 nike

我有这样的场景,用户有自己的角色

NormalUser
Custodian
Finance

Custodian 和 Finance 都是SuperUser

我如何检查角色保管人是否是 super 用户

这是我的示例代码..

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

我期待一个

Custodian is in All: True,
保管人是 super 用户:正确
金融无处不在:正确
财务是 super 用户:正确
普通用户是全部:True

最佳答案

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 如何与上一节中为标志设置的位对齐。

关于c# - 结合枚举值和位标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19582477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com