C# 相同ID和不同描述的枚举问题
我面临着C#中Enum的问题 我有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
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值。因此,即使在代码中,您是