如何在 C# 中打开具有重复值或布尔值的枚举?

发布于 2024-11-01 21:16:56 字数 338 浏览 1 评论 0原文

给定一个枚举类型:

enum SOMEENUM 
{
   A = true,
   B = false,
   C = true
}

我想切换,例如:

public void SWITCHON (SOMEENUM sn) 
{
   switch(s)
   {
      case SOMEENMUM.A : xxxxxxxx.......
   }
}

但这无法编译;我猜它使用了枚举的 bool 值。

我想打开 Enum,就好像没有为其分配值一样。

Given an enum type:

enum SOMEENUM 
{
   A = true,
   B = false,
   C = true
}

I want to switch on this like:

public void SWITCHON (SOMEENUM sn) 
{
   switch(s)
   {
      case SOMEENMUM.A : xxxxxxxx.......
   }
}

But this doesn't compile; I guess it's using the bool value of the enum.

I want to do switch on Enum as if there is no value assigned to it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

痞味浪人 2024-11-08 21:16:56

首先:
C# 中的枚举不支持 bool 作为值。
所以它应该是整数。
如果我们将枚举的 2 个属性设置为相同的值,我们可以认为其中一个丢失了。
根据我的理解,你实际上想做的是:
以某种方式标记枚举的 2 个属性是相等的。
我的建议:

public enum MyEnum
{
    [Description("true")]
    A = 1,
    [Description("false")]
    B = 2,
    [Description("true")]
    C = 3
}

将返回 bool 的 Enum 扩展 因此

 public static class EnumEx
    {
        public static bool GetDescriptionAsBool(this Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            DescriptionAttribute attribute
                    = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                        as DescriptionAttribute;
            if(attribute == null)
            {
                //throw new SomethingWentWrongException();
            }
            return bool.Parse(attribute.Description);
        }
    }

,您可以正常切换,并且可以随时检查您的枚举 boll 标志是什么,只需调用该实例的 GetDescriptionAsBool 方法即可。

First of all:
Enums in C# do not support bool as value.
So It should be integers.
If we set 2 property's of enum to the same value we can consider one of them lost.
From my understanding what you actually is trying to do is:
Somehow flag that 2 property's of enum are equal.
My suggestion:

public enum MyEnum
{
    [Description("true")]
    A = 1,
    [Description("false")]
    B = 2,
    [Description("true")]
    C = 3
}

Extension for Enum which will return bool

 public static class EnumEx
    {
        public static bool GetDescriptionAsBool(this Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            DescriptionAttribute attribute
                    = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                        as DescriptionAttribute;
            if(attribute == null)
            {
                //throw new SomethingWentWrongException();
            }
            return bool.Parse(attribute.Description);
        }
    }

As a result you can switch normally and at any time can check what is your enums boll flag just calling GetDescriptionAsBool method of that instance.

少钕鈤記 2024-11-08 21:16:56

重复的值只是同一事物的不同名称。没有办法区分,因为枚举是作为值存储的,而不是作为名称存储的。

至于 bool 值,您可以使用 if 而不是 switch

Repeated values are just different names for the same thing. There's no way to tell the difference because enums are stored as the values, not as the names.

As for bool values, you use an if for those instead of a switch.

何以畏孤独 2024-11-08 21:16:56

枚举需要数值但不必设置。我建议删除就

enum SOMEENUM 
{ 
   A, 
   B,
   C
}

这样

public void SWITCHON (SOMEENUM s) 
{
    switch(s) 
    { 
        case SOMEENMUM.A : ...do stuff...
             break;
        case SOMEENMUM.B : ...do stuff...
             break;
        case SOMEENMUM.c : ...do stuff...
             break;
    }
}

enums require numerical values but do not have to be set. I suggest just removing leaving it like

enum SOMEENUM 
{ 
   A, 
   B,
   C
}

so

public void SWITCHON (SOMEENUM s) 
{
    switch(s) 
    { 
        case SOMEENMUM.A : ...do stuff...
             break;
        case SOMEENMUM.B : ...do stuff...
             break;
        case SOMEENMUM.c : ...do stuff...
             break;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文