gpt4 book ai didi

c# - 在不声明所有可能的组合的情况下打开 Enum(带有 Flags 属性)?

转载 作者:IT王子 更新时间:2023-10-29 03:53:13 31 4
gpt4 key购买 nike

我如何打开一个设置了 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 条件

有点像

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 条件,而不是像使用开关时那样“跳转”到仅需要的“案例”。

有什么 Elixir 可以解决这个问题吗?

我想到了循环声明的值然后使用开关的可能性,然后它只会为每个声明的值点击开关,但我不知道它是如何工作的,如果它的性能副是好主意(与很多 if 相比)?

是否有一种简单的方法来遍历声明的所有枚举值?

我只能想到使用 ToString() 并按“,”拆分,然后遍历数组并解析每个字符串。


更新:

我发现我解释得不够好。我的例子很简单(试图简化我的场景)。

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

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

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

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

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

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

最佳答案

这个怎么样。当然DoSomething的参数和返回类型等,可以是任何你喜欢的。

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

private static bool DoSomething(IEnumerable cln)
{
Console.WriteLine("DoSomething");
return true;
}

private static bool DoSomethingElse(IEnumerable cln)
{
Console.WriteLine("DoSomethingElse");
return true;
}

private static bool DoWhatever(IEnumerable cln)
{
Console.WriteLine("DoWhatever");
return true;
}

static void Main(string[] args)
{
var theCheckType = CheckType.QueryString | CheckType.TempData;
var checkTypeValues = Enum.GetValues(typeof(CheckType));
foreach (CheckType value in checkTypeValues)
{
if ((theCheckType & value) == value)
{
switch (value)
{
case CheckType.Form:
DoSomething(null);
break;
case CheckType.QueryString:
DoSomethingElse(null);
break;
case CheckType.TempData:
DoWhatever(null);
break;
}
}
}
}
}

关于c# - 在不声明所有可能的组合的情况下打开 Enum(带有 Flags 属性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1040731/

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