HasFlag 无法识别角色分配

2024-01-31

我正在使用用 [Flags] 装饰的枚举来控制 MVC2 应用程序中的自动化。下面是我的代码示例:

[Flags]
public enum SecurityRoles
{
    None = 0,
    Executive = 1,
    BackOffice = 2,
    AccountManager = 4,
    Consultant = 8,
    Administrator = 16
}

[TestMethod]
public void MultipleSelectionsTest()
{
    var requiredRoles = SecurityRoles.Executive | SecurityRoles.BackOffice;
    var user1Roles = SecurityRoles.Executive | SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant;
    var user1HasAccess = user1Roles.HasFlag(requiredRoles);

    var user2Roles = SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant;
    var user2HasAccess = user2Roles.HasFlag(requiredRoles);


    Assert.IsTrue(user1HasAccess);  //returns true
    Assert.IsTrue(user2HasAccess);  //returns false
}

如您所见,user2Roles 包含 BackOffice 角色,requiredRoles 也包含 BackOffice 角色,但是 user HasAccess 为 false。这是为什么?我缺少什么?用户 HasAccess 为 true。


如果我错了,请纠正我(因为我可能是这样),但是当您执行 Enum 标志检查时,.NET 本质上是对表示标志总和的整数进行二进制算术。

所以有SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant与值为 26 或相同11010以二进制形式。

当您调用 Enum.HasFlags 时,正在执行的操作是return thisInstance & flag == flag

因此,如果您要根据您所需的角色检查前面提到的标志集SecurityRoles.Executive | SecurityRoles.BackOffice值为 3 或11在二进制中,数学是这样的:

11010 - 26 Administrator | BackOffice | Consultant
00011 -  3 Executive | BackOffice
----- 
00010 -  2 BackOffice which really doesn't mean anything useful

那么接下来就是26 & 3 == 3是假的。

为了彻底起见,给出SecurityRoles.Executive | SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant值为 27 或11011在二进制中,数学是这样的:

11011 - 26 Executive  | Administrator | BackOffice | Consultant
00011 -  3 Executive | BackOffice
----- 
00011 -  3 Executive | BackOffice

那么接下来就是26 & 3 == 3是真的。

像这样的扩展方法可能是值得的(未经测试)

public static bool HasFlags(this Enum source, Enum[] flags) 
{
    return flags.Any(f => source.HasFlag(f));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HasFlag 无法识别角色分配 的相关文章

  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • 为什么以下代码不允许我使用 fgets 获取用户输入但可以使用 scanf?

    这是一个更大程序的简短摘录 但该程序的其余部分无关紧要 因为我认为我能够隔离该问题 我怀疑这与我使用 fgets 的方式有关 我读过 最好使用 fgets 而不是 scanf 但我似乎无法让它在这里正常工作 当我使用以下代码时 程序不会给我
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 如何在 C++ 中使用 PI 常数

    我想在一些 C 程序中使用 PI 常数和三角函数 我得到三角函数include
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 如何使用 JavaScript 创建 zip 文件?

    我发现了一个可以生成zip文件的javascript插件 它的名字叫jszip https stuk github io jszip 我尝试过 但我认为它只能生成将在 zip 文件中编译的文件 我想要的是能够将现有文件添加到它将生成的 zi
  • SQLite 的 DLL 地狱

    我们的一些用户遇到了运行时加载的 sqlite interop dll 版本的问题 这确实令人头疼 背景 为 AnyCPU 构建的 WPF 应用程序 使用 SQlite NET 和 sqlite interop dll 版本 1 0 89
  • 如何叠加两个geom_bar?

    我正在尝试覆盖 2 个条形图geom bar源自 2 个独立的 data frames dEQ lab perc 1 lmP 55 9 2 lmN 21 8 3 Nt 0 6 4 expG 5 6 5 expD 0 0 6 prbN 11
  • 如何使用 java.util.logging 对齐日志消息

    有人可以发布如何实现日志消息对齐 10 14 31 main package1 Class1
  • 在linux上,如何检查端口是否处于监听状态而不尝试连接

    如何使用 C 检查本地计算机上的端口 如果也需要传递 IP 或接口 是否处于侦听状态 我不想连接到这个端口进行检查 因为我不想激怒这个端口后面的服务 我想用它来将缺少的 net tcp listen 项目添加到 Zabbix 编辑 这是真正
  • 如何在多列上创建全文索引?

    我正在运行以下查询tbl query select from tbl query q where match q query desc q query desc details against test1 WITH QUERY EXPANS
  • 分配对象的严格别名规则

    C99 6 5 6 访问其存储的对象的有效类型 value 是对象的声明类型 如果有 75 如果通过类型将值存储到没有声明类型的对象中 左值的类型不是字符类型 则类型为 左值成为该访问的对象的有效类型 以及不修改存储值的后续访问 如果使用将
  • Scala、Java 和平等

    val filesHere new java io File listFiles val filesHere2 new java io File listFiles scala gt filesHere filesHere2res0 布尔值
  • Angular2组件:测试表单输入值变化

    我有一个文本输入 我正在监听更改 mycomponent ts ngOnInit this searchInput new Control this searchInput valueChanges distinctUntilChanged
  • 在印度使用 Spotify iOS SDK

    我正在创建一个流媒体应用程序 并希望使用 Spotify iOS SDK 来实现流媒体目的 但是 Spotify 的服务在印度不可用 我有 Spotify 高级帐户 位于美国 开发工作将在印度举行 我的问题是 我可以使用美国的高级帐户在印度
  • ES6 `从导入导出*`?

    是否有使用 ES6 或 ES7 或 babel 的语法可以让我轻松地将多组子文件捆绑在一起 例如 给定 action creators index js action creators foo actions js action creat
  • Haskell Cabal 为所有已安装的软件包重新生成文档

    如何为所有本地安装的 cabal 软件包生成并安装文档 我在 cabal config 中打开了文档标志 这意味着所有新安装的软件包也将生成文档 但是如何为所有已安装的软件包生成文档呢 有没有办法自动cabal install reinst
  • 将文件信息从 html 文件选择器输入传递给 python 和 bokeh

    我正在尝试创建一个简单的散景服务器应用程序 允许用户从
  • IntelliJ Github 问题

    尝试将项目推送到 github 时出现以下错误 remote Permission to RedNetty RedPractice git denied to JackCDev fatal unable to access https gi
  • 除了 @Produces 注释之外,Jersey (JAX-RS) 如何知道将 POJO 视为特定的 mime 类型?

    我看到很多泽西岛的例子 看起来像这样 public class ItemResource GET Path items Produces text xml application json public List
  • Android-是否可以在字符串资源中添加可点击的链接

    我通常会设置某种AlertDialog当用户第一次使用我的一个应用程序时触发 我解释如何使用该应用程序并对他们刚刚下载的内容进行总体介绍 我通常也从一个加载我的字符串strings xml file 我想要做的是使我的字符串资源中的单词之一
  • 通过 Python 运行终端命令时出现问题

    我正在开发一个小项目 我需要通过 python 控制控制台播放器 此示例命令在 Linux 终端上完美运行 mplayer loop 0 playlist lt find mnt music soundtrack type f egrep
  • SceneKit 统计数据显示中的“Metal Flush”是什么?

    我正在尝试解决 FPS 下降的问题 我发现金属冲洗占据了大部分渲染时间 那是件好事儿吗 I am not sure关于这一点 因为苹果似乎没有在任何地方记录 Metal Flush 到底是什么 但我会根据以前使用 OpenGL 的经验来回答
  • Android 语音识别器未连接到识别服务

    我想在我的 Android 应用程序中引入永久语音识别功能 我知道语音识别在 Android 4 1 1 和 4 2 上有时会冻结 因此我建立了一个计时器 并且时不时地检查语音识别是否仍然存在 以及是否处于活动状态 不活着我停止它然后开始它
  • HasFlag 无法识别角色分配

    我正在使用用 Flags 装饰的枚举来控制 MVC2 应用程序中的自动化 下面是我的代码示例 Flags public enum SecurityRoles None 0 Executive 1 BackOffice 2 AccountMa