枚举位字段我这个问题的标题道歉,但我想不出更好的方式来描述一下我试图完成..支持继承
我想用做一个枚举Flags属性,枚举的按位值创建一些继承模式。
示例:假设我们有食物的位域枚举:
[Flags]
enum Foods
{
// Top Level foods
Meat,
Fruit,
Vegetables,
Dairy,
Grain,
BenJerrysOatmealCookieChunk, // ;)
// sub-Meat
Chicken,
Beef,
Fish,
// sub-Fruit
Apple,
Banana,
// sub-Vegetables
Spinach,
Broccoli,
// sub-Dairy
Cheese,
Milk,
// sub-Grain
Bread,
Pasta,
Rice,
// sub-Beef
Tritip,
Hamburger,
// sub-Fish
Salmon,
Halibut,
}
注意枚举如何包含食品的子类以及子子类别。 在我的现实世界中,我有一个未知数量的顶级类别和未知数量的子级别类别(包括未知级别的子子类别n)
我会喜欢设置枚举的位值,使得子类别(和子子类别n)将“继承”其直接父级的位值。
我想避免Foods属性的客户端设置者必须明确设置特定食物的所有标志。换句话说,我不希望客户制定者不得不做这样的事情:
myClass.Foods = Foods.Tritip | Foods.Beef | Foods.Meat;
我想创建一个结构,使得客户端制定者只需简单地设置一个标志和标志的所有家长都隐含在子标志内。
因此,如果客户端二传手这样做:
myClass.Foods = Foods.Tritip;
我们将能够成功运行以下条件:
if((myClass.Foods & Foods.Meat) == Foods.Meat)
Console.WriteLine("I am meat");
if((myClass.Foods & Foods.Beef) == Foods.Beef)
Console.WriteLine("I am beef");
if((myClass.Foods & Foods.Tritip) == Foods.Tritip)
Console.WriteLine("I am tritip");
if((myClass.Foods & Foods.Meat) == Foods.Meat)
Console.WriteLine("I am meat");
if((myClass.Foods & Foods.Rice) != Foods.Rice)
Console.WriteLine("I am definitely not rice!");
什么混淆了我对这个问题是什么比特值以用于enum中的每个食物。我最初开始了:
[Flags]
enum Foods
{
// Top Level foods
Meat = 0x1,
Fruit = 0x2,
Vegetables = 0x4,
Dairy = 0x8,
Grain = 0x10,
BenJerrysOatmealCookieChunk = 0x20, // ;)
...and so on.
}
..但因为我不知道有多少水平会有(枚举名单将随时间增长)。我不知道如何创建我的位值所以他们允许增长。
有没有人试图做到这一点?如果是这样,你的位值的业务逻辑是什么?
我有一个偷偷摸摸的感觉,这个问题将需要一个赏金;)
我不会打出来的房子获得本杰里上午2:30 。 – BoltClock
当你知道你可以有任意数量的元素时,试图用枚举来做这件事实在太疯狂了。我们大多数人使用相互之间具有层次关系的元素树,通常存储在关系数据库或XML中。 'myclass.HasAncestorCategory(“肉”)'更容易。 –