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

时间:2017-06-09 09:09:34

标签: 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 = Flags.FlagYes;
string Description = flag.Description();

我进入了Description值"标志号"但我需要" 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 个答案:

答案 0 :(得分:2)

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

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

能够使用FlagNoItemNo访问FlagYesItemYes,因为它们也已定义,但值相同。

为了解决您的问题,您必须将enum修改为:

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

}

根据评论进行编辑:

  

我得到“Flag No”但我需要“Flag Yes”。有人帮我解决了这个问题吗?

要回复你的评论,如果你有一个非常强烈的理由为什么你想拥有相同的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

答案 1 :(得分:0)

你想要的是不可能的。由于您同时为两个枚举条目分配了1,因此无法区分它们,因为在内部,只考虑数值。

答案 2 :(得分:0)

.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。但是,仍可以区分ItemNoFlagNo

答案 3 :(得分:0)

正如其他人已经说过你目前正在做的事情是不可能的,你不能有两个具有相同整数值的标志,然后尝试区分它们

另一种方法是将枚举更改为具有用于将其他值组合在一起的其他值:

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
}

然后,您可以检查枚举是否为Flag或Item,如下所示:

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

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

更新

正如其他人所解释的那样,Enum的基础类型是int值。因此,即使在您的代码中,您说的是FlagYes,也是传递该方法的值1。然后,您的代码会查找值1并找到FlagsNo。 数字1不能同时代表FlagsYesFlagNo

如果你需要你的枚举值为1和2,但也需要FlagsYes和FlagsNo你有两个独立的问题,需要创建一个不同的解决方案。

如果FlagsYesFlagsNo的值是任意的,并且只要它们相同,则可以根据上面的代码创建组枚举值。