C# 相同ID和不同描述的枚举问题

C# 相同ID和不同描述的枚举问题,c#,.net,visual-studio-2015,enums,C#,.net,Visual Studio 2015,Enums,我面临着C#中Enum的问题 我有enum相同id但不同描述的数据 public enum Flags { [Description("Flag Yes")] FlagYes=1, [Description("Flag No")] FlagNo=1, [Description("Item Yes")] ItemYes=2, [Description("Item No")] ItemNo=2, } Flags flag = Flag

我面临着C#中Enum的问题

我有
enum
相同id但不同描述的数据

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Flag No")]
    FlagNo=1,
    [Description("Item Yes")]
    ItemYes=2,
    [Description("Item No")]
    ItemNo=2,
}

Flags flag = Flags.FlagYes;
string Description = flag.Description();
我进入了
描述
值“Flag No”,但我需要“Flag Yes”。有谁能帮我修一下这个吗

我使用下面的通用代码从
enum
获取描述

public static string Description(this Enum Value)
{
    FieldInfo field = Value.GetType().GetField(Value.ToString());
    DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
    return attribute == null ? Value.ToString() : attribute.Description;
}

有什么解决方案请告诉我?

您在
枚举中有4个值,但只有两个“真实”值。
因此,您在问题中发布的
enum
实际上更可能等于:

public enum Flags
{
    [Description("Flag No")]
    FlagNo=1,
    [Description("Item No")]
    ItemNo=2,
}
能够使用
FlagYes
ItemYes
访问
FlagNo
ItemYes
,因为它们也已定义,但具有相同的值

为了解决您的问题,您必须修复
enum
,如下所示:

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Flag No")]
    FlagNo=2,
    [Description("Item Yes")]
    ItemYes=3,
    [Description("Item No")]
    ItemNo=4,
}

根据评论编辑:

我有“国旗不”,但我需要“国旗是”。有谁能帮我修一下这个吗

为了回复您的评论,如果您有很强的理由为什么要使用相同的ID,我建议您最好使用两个
enum
,一个表示是,一个表示否,就像您使用它的方式一样:

Flags flag = Flags.FlagYes;
string Description = flag.Description();
不会让“代码”神奇地知道要给你什么描述,因此如果你愿意,这里有另一种方法,使用两个
enum
的相同ID来完成:

public enum YesFlags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Item Yes")]
    ItemYes=2
}

public enum NoFlags
{
    [Description("Flag No")]
    FlagNo=1,
    [Description("Item No")]
    ItemNo=2
}

然后您可以使用具有相同ID的所需
enum

您在
enum
中有4个值,但只有两个“真实”值。
因此,您在问题中发布的
enum
实际上更可能等于:

public enum Flags
{
    [Description("Flag No")]
    FlagNo=1,
    [Description("Item No")]
    ItemNo=2,
}
能够使用
FlagYes
ItemYes
访问
FlagNo
ItemYes
,因为它们也已定义,但具有相同的值

为了解决您的问题,您必须修复
enum
,如下所示:

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Flag No")]
    FlagNo=2,
    [Description("Item Yes")]
    ItemYes=3,
    [Description("Item No")]
    ItemNo=4,
}

根据评论编辑:

我有“国旗不”,但我需要“国旗是”。有谁能帮我修一下这个吗

为了回复您的评论,如果您有很强的理由为什么要使用相同的ID,我建议您最好使用两个
enum
,一个表示是,一个表示否,就像您使用它的方式一样:

Flags flag = Flags.FlagYes;
string Description = flag.Description();
不会让“代码”神奇地知道要给你什么描述,因此如果你愿意,这里有另一种方法,使用两个
enum
的相同ID来完成:

public enum YesFlags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Item Yes")]
    ItemYes=2
}

public enum NoFlags
{
    [Description("Flag No")]
    FlagNo=1,
    [Description("Item No")]
    ItemNo=2
}

然后,您可以使用具有相同ID的必需的
枚举。

您想要的是不可能的。由于您已将1分配给两个枚举项,因此无法区分它们,因为在内部,只考虑数值。

您想要的是不可能的。由于两个枚举项都指定了1,因此无法区分它们,因为在内部,只考虑数值。

在.NET中的枚举基本上是一个整数,编译器可以帮助您确保它只是先前选定的常量范围之一。因为枚举是值类型,所以在运行时只存在基础编号。并没有额外的字段来指定哪些常量的含义,因为这应该用那个数字编码

但是,作为数字,您可以处理枚举的所有整数操作,其中包括按位操作。您可能遇到了组合标记枚举的
|
运算符,但也可以使用掩码:

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Flag No")]
    FlagNo=5,
    [Description("Item Yes")]
    ItemYes=2,
    [Description("Item No")]
    ItemNo=6,
    Mask=3
}

然后,您可以使用
value&Flags.Mask
还原您的id。但是,
ItemNo
FlagNo
仍然可以区分。

在.NET中的枚举基本上是一个整数,编译器可以帮助您确保它只是先前选择的常量范围之一。因为枚举是值类型,所以在运行时只存在基础编号。并没有额外的字段来指定哪些常量的含义,因为这应该用那个数字编码

但是,作为数字,您可以处理枚举的所有整数操作,其中包括按位操作。您可能遇到了组合标记枚举的
|
运算符,但也可以使用掩码:

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes=1,
    [Description("Flag No")]
    FlagNo=5,
    [Description("Item Yes")]
    ItemYes=2,
    [Description("Item No")]
    ItemNo=6,
    Mask=3
}

然后,您可以使用
value&Flags.Mask
还原您的id。但是,
ItemNo
FlagNo
仍然可以区分。

正如其他人所说,您当前所做的是不可能的,您不能有两个具有相同整数值的标志,然后尝试区分它们

另一种方法是将枚举更改为具有其他值,以便将其他值分组在一起:

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes = 1,
    [Description("Flag No")]
    FlagNo = 2,
    [Description("Item Yes")]
    ItemYes = 4,
    [Description("Item No")]
    ItemNo = 8,
    IsFlag = (FlagYes | FlagNo), //group Flag values 
    IsItem = (ItemYes | ItemNo)  //group Item values
}
然后,您可以检查枚举是否是如下所示的标志或项目:

public bool IsFlag(Flags a)
{
    return (Flags.IsFlag.HasFlag(a));
}

public bool IsItem(Flags a)
{
    return (Flags.IsFlag.HasFlag(a));
}
更新

正如其他人所解释的,枚举的基本类型是int值。因此,即使在代码中您说的是
FlagYes
,传递给方法的还是值1。然后,代码查找值1并找到
FlagsNo
。 数字1不能同时表示
FlagsYes
FlagNo

如果需要枚举为值1和2,但也需要Flagsys和FlagsNo,则需要创建不同的解决方案


如果
FlagsYes
FlagsNo
的值是任意的,只要它们相同,就可以执行任何操作,那么您可以按照上述代码创建组枚举值

正如其他人所说,您当前所做的是不可能的,您不能有两个具有相同整数值的标志,然后尝试区分它们

另一种方法是将枚举更改为具有其他值,以便将其他值分组在一起:

public enum Flags
{
    [Description("Flag Yes")]
    FlagYes = 1,
    [Description("Flag No")]
    FlagNo = 2,
    [Description("Item Yes")]
    ItemYes = 4,
    [Description("Item No")]
    ItemNo = 8,
    IsFlag = (FlagYes | FlagNo), //group Flag values 
    IsItem = (ItemYes | ItemNo)  //group Item values
}
然后,您可以检查枚举是否是如下所示的标志或项目:

public bool IsFlag(Flags a)
{
    return (Flags.IsFlag.HasFlag(a));
}

public bool IsItem(Flags a)
{
    return (Flags.IsFlag.HasFlag(a));
}
更新

正如其他人所解释的,枚举的基本类型是int值。因此,即使在代码中,您是