我在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;
}
任何解决方案请告诉我?
答案 0 :(得分:2)
enum
中有4个值,但只有两个“真实”值
因此,您在问题中发布的enum
实际上更有可能与此相同:
public enum Flags
{
[Description("Flag No")]
FlagNo=1,
[Description("Item No")]
ItemNo=2,
}
能够使用FlagNo
和ItemNo
访问FlagYes
和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,
}
根据评论进行编辑:
我得到“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。但是,仍可以区分ItemNo
和FlagNo
。
答案 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不能同时代表FlagsYes
和FlagNo
。
如果你需要你的枚举值为1和2,但也需要FlagsYes和FlagsNo你有两个独立的问题,需要创建一个不同的解决方案。
如果FlagsYes
和FlagsNo
的值是任意的,并且只要它们相同,则可以根据上面的代码创建组枚举值。