我在数据库中有一些项目。每个'都可以有许多标签,如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
函数时,我没有获得所有可浏览的项目,菜单中,或浏览器和菜单中的项目。
答案 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
}
关于枚举的说明:
默认情况下,枚举有一个int 在下面,和所有整数一样 在C#中,枚举的默认值为0 第一次创建时。所以,如果0不是 映射到枚举常量 然后你的枚举将被实例化 无效的有效