gpt4 book ai didi

c# - 具有相同值的多个枚举

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:54 24 4
gpt4 key购买 nike

我有一组常量,我在我的 C# 项目中使用枚举。在某些情况下我只需要一个值,而在其他情况下我需要多个值。我开始使用 IEnumerable 或我的枚举类型的简单数组来处理多个值。但是,我最近开始需要在属性构造函数中为多个属性设置多个值,我想将这些值放入类的常量字段中。

一个简单的例子:

public enum Browsers {
Firefox, Chrome, IE, Opera, Safari
}

public class SomeClass {
[Attr(new Browsers[] { Browsers.Firefox, Browsers.Chrome })]
public void SomeMethod() { }

[Attr(new Browsers[] { Browsers.Firefox, Browsers.Chrome })]
public void SomeOtherMethod() { }
}

我想将浏览器数组重构为类中的一个字段,但是对于要在属性构造函数中使用的字段,它必须是一个常量字段,并且具有数组初始化的字段不能是常量。

然后我尝试在我的枚举上使用 FlagsAttribute,以便枚举可以包含多个值。然后我可以创建一个字段 private const Browsers = Browsers.Firefox | Browsers.Chrome 我很好。在这个情况下。

在我只需要一个值的情况下,应用 FlagsAttribute 从而允许多个值并不是很好。在那些情况下,我总是必须首先检查枚举是否只有一个值(我通过检查它是否是 2 的幂来做到这一点)。我觉得这有点烦人。以一种情况下的可维护性换取其他情况下的较低可维护性 - 并不理想。

所以我的问题是是否有一些聪明的方法来解决这个问题?我想制作两个单独的枚举,一个带有 FlagsAttribute,另一个不带,但是我将不得不在两个地方而不是一个地方维护枚举的所有值。再次不理想。

我是否错过了一些可以以不牺牲任何地方的可维护性的方式解决这个问题的东西?

更新:我希望我的代码看起来像这样:

public class SomeClass {
private const Browsers[] browsers = new Browsers[] { Browsers.Firefox, Browsers.Chrome };

[Attr(browsers)]
public void SomeMethod() { }

[Attr(browsers)]
public void SomeOtherMethod() { }
}

但是这会导致编译错误。

我使用仅具有单个值的枚举的地方的示例:

public void SomeMethod(Browsers browser) {
/* When using Flags I need to verify that browser contains only a single value */
switch(browser)
{
case Browsers.Firefox:
/* do something */
break;
case Browsers.Chrome:
/* do something */
break;
/* cases for the rest of the values */
}

}

我的问题是:我能否以某种方式创建两个具有相同值的枚举,其中一个具有 Flags 属性而另一个没有?

额外的问题:是否有更聪明的解决方法,我只是没有看到?

最佳答案

多个枚举成员可以共享相同的关联值。例子

enum Color 
{
Red,
Green,
Blue,
Max = Blue
}

显示一个枚举,其中两个枚举成员(Blue 和 Max)具有相同的关联值。

关于c# - 具有相同值的多个枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25037530/

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