javascript

java

python

c#

android

c++

node.js

php

reactjs

jquery

html

css

ios

.net

git

ruby-on-rails

sql

c

string

ruby

开启枚举(带有Flags属性)而没有声明所有可能的组合吗?

如何打开设置了flags属性(或更确切地说是用于位操作)的枚举?

我希望能够在匹配声明值的开关中找到所有情况。

问题是,如果我有以下枚举

[Flags()]public enum CheckType
{
    Form = 1,   
    QueryString = 2,
    TempData = 4,
}

我想使用这样的开关

switch(theCheckType)
{
   case CheckType.Form:
       DoSomething(/*Some type of collection is passed */);
       break;

   case CheckType.QueryString:
       DoSomethingElse(/*Some other type of collection is passed */);
       break;

   case CheckType.TempData
       DoWhatever(/*Some different type of collection is passed */);
       break;
}

如果“ theCheckType”设置为两个CheckType.Form | CheckType.TempData我希望它能同时击中两种情况。 显然,由于中断,它不会在我的示例中同时命中,但除此之外,由于CheckType.Form不等于CheckType.Form |,它也会失败。 CheckType.TempData

正如我所看到的,唯一的解决方案是为枚举值的每种可能组合辩护?

就像是

    case CheckType.Form | CheckType.TempData:
        DoSomething(/*Some type of collection is passed */);
        DoWhatever(/*Some different type of collection is passed */);
        break;

    case CheckType.Form | CheckType.TempData | CheckType.QueryString:
        DoSomething(/*Some type of collection is passed */);
        DoSomethingElse(/*Some other type of collection is passed */);
        break;

... and so on...

但这确实不是很理想(因为它将很快变得很大)

现在我有3个如果条件恰好在彼此之后

就像是

if ((_CheckType & CheckType.Form) != 0)
{
    DoSomething(/*Some type of collection is passed */);
}

if ((_CheckType & CheckType.TempData) != 0)
{
    DoWhatever(/*Some type of collection is passed */);
}

....

但这也意味着,如果我有一个带有20个值的枚举,则每次必须经过20个If条件,而不是像使用开关时那样仅“跳转”到所需的“ case” /。

有解决这个问题的魔术方法吗?

我已经考虑过循环遍历声明的值然后使用开关的可能性,然后它将仅对每个声明的值命中该开关,但是我不知道它将如何工作以及如果它对性能有不利影响( 相比许多如果)?

有没有一种简单的方法可以遍历声明的所有枚举值?

我只能提出使用ToString()并按“,”进行分割,然后遍历数组并解析每个字符串。


更新:

我看到我的解释还不够好。我的示例很简单(试图简化我的方案)。

我将它用于Asp.net MVC中的ActionMethodSelectorAttribute,以确定在解析url / route时是否应该可用的方法。

我通过在方法上声明这样的东西来做到这一点

[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
    return View();
} 

这意味着它应该检查Form或TempData是否具有为可用方法指定的键。

它将要调用的方法(在我之前的示例中为doSomething(),doSomethingElse()和doWhatever())实际上将bool作为返回值,并将使用参数进行调用(不同的集合不共享可共享的接口) 使用-请在下面的链接等中查看我的示例代码)。

为了希望更好地了解我在做什么,我粘贴了一个我实际上在pastebin上正在做的简单示例-可以在这里找到[http://pastebin.com/m478cc2b8]

trans by 2020-07-06T05:24:15Z

JavaScript中的枚举标志

我需要在Javascript中模拟枚举类型,方法似乎非常简单:

var MyEnum = {Left = 1; Right = 2; Top = 4; Bottom = 8}

现在,在C#中,我可以像这样组合这些值:

MyEnum left_right = MyEnum.Left | MyEnum.Right

然后我可以测试枚举是否具有一定的价值:

if (left_right & MyEnum.Left == MyEnum.Left) {...}

我可以在JavaScript中做类似的事情吗?

trans by 2020-07-05T07:30:49Z

位操作-检查标志位j

我的标志位有问题。我有一个int变量来保存标志。 首先,我为该变量设置了一些标志。 稍后,我需要检查在该变量中设置了多少个标志。 但是我不知道这样做。

trans by 2020-06-30T06:03:11Z

从Android应用安装程序和主屏幕启动应用程序时的活动堆栈排序问题

仅出于测试目的,我允许通过URL下载和安装我的应用APK。 一旦下载到手机上,便可以通过Android应用安装程序启动,该安装程序为用户提供了将其安装到其设备上然后运行它的选项。

考虑我们是否以上述方式下载并运行了该应用程序。 我的应用程序中的主要/启动程序活动是登录页面(FLAG_ACTIVITY_BROUGHT_TO_FRONT)。 用户通过身份验证后,将被带到应用程序的主要区域,例如 onCreate()。因此,此任务的当前活动堆栈为A > B > A

然后,我按手机上的主屏幕按钮,然后转到Android主屏幕。 我通过菜单中的图标重新启动我的应用程序,然后转到FLAG_ACTIVITY_BROUGHT_TO_FRONT,而不是onCreate()。活动堆栈现在为A > B > A,或者现在有两个单独的任务,活动堆栈分别为A > BA。 重新启动应用程序时,我想要的是回到Activity B。 在此状态下按一下将把我带回到Activity B

仅当我首先通过安装程序打开应用程序时才会发生这种不希望的行为,而如果我通过主屏幕/菜单打开应用程序则不会发生。

我研究了每种机制如何开始活动。 使用应用安装程序时,我们会看到以下日志:

INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }

通过启动器/主屏幕:

INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }

使用安装程序启动时,我们看到它正在使用标志FLAG_ACTIVITY_BROUGHT_TO_FRONT,但是使用启动程序启动时,我们看到它正在使用onCreate()。它也使用了意图类别。

从文档中,我们看到的标志是:

public static final int FLAG_ACTIVITY_NEW_TASK
Constant Value: 268435456 (0x10000000)

public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Constant Value: 2097152 (0x00200000)

标志FLAG_ACTIVITY_BROUGHT_TO_FRONT(从启动器启动应用程序时正在使用)似乎通常阻止创建新任务(如果已经存在),并将恢复上一次使用的活动。 这是期望的行为。 为什么在这种情况下不起作用? 有什么我可以确保我的应用程序始终使我返回上一个活动的方法,无论它是否通过应用程序安装程序/启动程序启动?

如果我使用FLAG_ACTIVITY_BROUGHT_TO_FRONT,则每当我运行该应用程序时,它总是会带我回到主要活动(onCreate())(这也不可取)。

这是一个我发现有人遇到类似问题的问题(没有可接受的答案):从另一个应用程序启动时,应用程序失去了记住其堆栈的能力

编辑:检查我们的启动程序活动的onCreate()中的标志FLAG_ACTIVITY_BROUGHT_TO_FRONT(然后完成设置(如果已设置))似乎可以解决主要症状,但是很明显,根本问题仍然存在。 是否有更完整的修复程序?

EDIT2:当您从Android Market下载/运行应用程序时,会出现相同的结果,因此上述某些详细信息可能不相关。

trans by 2020-01-29T08:26:58Z

优化-GCC:三月与mtune有何不同?

我为此尝试清理了GCC手册页,但实际上还是不明白。

-march-mtune有什么区别?

什么时候只使用-march,而两者都用? 是否有可能只有-mtune

trans by 2019-09-27T10:48:11Z

java - 打印所有JVM标志

找到一个有趣的JVM标志:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version

它打印了数百种不同的选项,我以前从未听说过。它还会打印默认值,这有助于更好地诊断JVM行为。另一个有趣的标志是:

-XX:+UnlockExperimentalVMOptions

有谁知道任何解释其中每一个的文件?

trans by 2019-09-15T23:48:58Z

命令行 - Perl标志-pe,-pi,-p,-w,-d,-i,-t?

我已经看到了许多使用不同标志运行Perl代码或脚本的方法。 但是,当我尝试google每个标志的含义时,我主要将结果发送到通用Perl网站,并且没有关于标志或其使用的具体信息。

以下是我经常遇到的旗帜,我不知道它们的含义:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

如果你告诉我每个人的意思和一些用例,或者至少告诉我找出其含义的方法,我将非常感激。

trans by 2019-08-09T21:56:31Z

优化 - 海湾合作委员会:游行与mtune有何不同?

我试图为此刷新GCC手册页,但仍然没有得到它,真的。

-march-mtune之间有什么区别?

什么时候只使用-march,而不是两者? 是否有可能只是-mtune

trans by 2019-06-20T22:23:03Z

位操作 - 如何删除C中的标志?

有一个变量,它包含一些标志,我想删除其中一个。 但我不知道如何删除它。

这是我如何设置标志。

my.emask |= ENABLE_SHOOT;
trans by 2019-06-07T04:42:36Z

c# - 如何检查是否设置了标志组合的标志?

假设我有这个枚举:

[Flags]
enum Letters
{
     A = 1,
     B = 2,
     C = 4,
     AB = A | B,
     All = A | B | C,
}

要检查是否设置了例如AB,我可以这样做:

if((letter & Letters.AB) == Letters.AB)

有没有更简单的方法来检查组合标志常量的任何标志是否设置为以下?

if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)

你可以换一下&吗?

对于像这样的二进制文件来说不太稳定......

trans by 2019-04-29T13:16:48Z

.net - 枚举上最常见的C#按位操作

对于我的生活,我不记得如何设置,删除,切换或测试位域中的位。 要么我不确定,要么混淆它们,因为我很少需要这些。 因此,“比特作弊表”会很好。

例如:

flags = flags | FlagsEnum.Bit4;  // Set bit 4.

要么

if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?

您能举例说明所有其他常见操作,最好是使用[Flags]枚举的C#语法吗?

trans by 2019-04-25T22:06:35Z

java - 打印所有JVM标志

找到一个有趣的JVM标志:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version

它打印了数百种不同的选项,我以前从未听说过。它还会打印默认值,这有助于更好地诊断JVM行为。另一个有趣的标志是:

-XX:+UnlockExperimentalVMOptions

有谁知道任何解释其中每一个的文件?

trans by 2019-04-21T12:23:47Z

.net - 枚举上最常见的C#按位操作

对于我的生活,我不记得如何设置,删除,切换或测试位域中的位。 要么我不确定,要么混淆它们,因为我很少需要这些。 因此,“比特作弊表”会很好。

例如:

flags = flags | FlagsEnum.Bit4;  // Set bit 4.

要么

if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?

您能举例说明所有其他常见操作,最好是使用[Flags]枚举的C#语法吗?

trans by 2019-03-11T13:06:33Z

c ++ - 用g ++编译C ++ 11

我正在尝试将我的C ++编译器更新为C ++ 11。我搜索了一下,我得出结论,我必须使用标志-std=c++0x-std=gnu++0x,但我不知道很多关于标志的事情。 谁能帮我? (我正在使用Ubuntu 12.04。)

以下是我尝试使用C ++ 11中包含的库(即数组)时从编译器获得的错误:

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

此文件需要编译器和库支持即将推出的ISO C ++标准C ++ 0x。 此支持目前是实验性的,必须使用-std = c ++ 0x或-std = gnu ++ 0x编译器选项启用。

trans by 2019-02-09T17:08:07Z

[Flags]枚举属性在C#中意味着什么?

我不时会看到如下的枚举:

[Flags]
public enum Options 
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

我不明白[Flags]属性到底是做什么的。

任何人都可以发布一个很好的解释或示例?

trans by 2019-01-13T02:07:18Z

1 共1页