枚举标志属性C#

Bas*_*007 5 c# enums attributes

我看了一些相同的主题,但没有找到我正在寻找的东西我应该使用flag enum flag atribute并检查我的数据是否在此枚举的一个集合中例如,enum:

[Flags]
private enum MyEnum {
Apple,
Orange,
Tomato,
Potato
Melon,
Watermelon,

Fruit = Apple | Orange,
Vegetable = Tomato | Potato,
Berry = Melon | Watermelon,
}
Run Code Online (Sandbox Code Playgroud)

在方法中,我应该检查输入数据.我该怎么做?

private void Checking(string data){
if(MyEnum.Fruit contains data) MessageBox.Show("Fruit");
if(MyEnum.Vegetable contains data) MessageBox.Show("Vegetables");
if(MyEnum.Berry contains data) MessageBox.Show("Berry");
}
Run Code Online (Sandbox Code Playgroud)

应该是什么而不是"包含数据"?

UPDATE

private void ZZZ(){
Cheching("Apple");
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 11

首先,您需要使用powers-of-2序列手动编号您的值:

[Flags]
private enum MyEnum 
{
  None = 0,   // often useful
  Apple = 1,
  Orange = 2,
  Tomato = 4,
  Potato = 8,
  Melon =  16,
  Watermelon = 32,

  Fruit = Apple | Orange,
  Vegetable = Tomato | Potato,
  Berry = Melon | Watermelon,
}
Run Code Online (Sandbox Code Playgroud)

[Flags]属性不是绝对必要的,它只控制ToString()行为.

要检查字符串是否与您的值匹配,您必须先将其设为枚举:

private void Checking(string data)
{      
    MyEnum v = (MyEnum) Enum.Parse(typeof(MyEnum), data);

    if((MyEnum.Fruit & v) != 0) MessageBox.Show("It's a Fruit"); 
    ...
}
Run Code Online (Sandbox Code Playgroud)

但请注意,Enum和字符串之间的交换是有限的,Parse()是有限的.