如何使用Flags属性?

时间:2011-07-05 11:05:15

标签: c# sql-server enums flags

我在数据库中有一些项目。每个'都可以有许多标签,如Browsable或IsInMenu等。我的一个朋友建议使用带有Flags属性的枚举来创建可扩展的解决方案。所以,我在DB中创建了一个取整数值的字段,然后创建了这个枚举:

 [Flags]
 public enum ItemTags { Browsable = 2, IsInMenu = 4}

现在我希望能够以这种方式在语义上获取某些项目的列表:

 public List<Item> GetItems(ItemTags tags)
 {
     /* 
     Code to get data from DB, something like, 
     return repository.GetList(tags);
     */
 }    

在用户界面中,我想打电话给:

 List<Item> items =  GetItems(ItemTags.Browsable | ItemTags.IsInMneu);

但我没有得到理想的结果。我走对了路吗? 根据预期的结果,我的意思是: 存储在数据库中的值现在可以是0,2,4,6值之一。 0表示该项目不在菜单中,也不在Browsable中。 2表示该项目是可浏览的,但不在菜单中。 4表示项目在菜单中,但不是可浏览的。 6表示项目是Browsable和IsInMenu。现在当我调用GetItems函数时,我没有获得所有可浏览的项目,菜单中,或浏览器和菜单中的项目。

3 个答案:

答案 0 :(得分:2)

您需要使用FlagsAttribute,请参阅此MSDN article和此usage example,最重要的是stack overflow answer

答案 1 :(得分:1)

您缺少Flags属性...

你的枚举应该像这样声明:

[Flags]
public enum ItemTags { Browsable = 2, IsInMenu = 4}

修改
更新后,它看起来很好。你应该更准确地理解你的意思:

  

但我没有得到理想的结果。

您向我们展示的代码看起来不错。因此,要么在其他地方存在问题,要么在应用程序中使用的代码和您在此处显示的代码不同。

答案 2 :(得分:1)

使用 FlagsAttribute类

  

表示枚举可以   被视为一个小领域;就是一套   旗帜。

[Flags] 
public enum ItemTags 
{ 
  Default =0,
  Browsable = 2, 
  IsInMenu = 4,
  All = 6 // Browsable / IsInMenu
}

More here

关于枚举的说明:

  

默认情况下,枚举有一个int   在下面,和所有整数一样   在C#中,枚举的默认值为0   第一次创建时。所以,如果0不是   映射到枚举常量   然后你的枚举将被实例化   无效的有效