Enum.HasFlag 未按预期工作
Enum.HasFlag is not working as expected
我有一个带有这样标志的枚举:
[Flags]
public enum ItemType
{
Shop,
Farm,
Weapon,
Process,
Sale
}
然后我在列表中有几个对象,其中一些设置了标志,一些标志未设置。它看起来像这样:
public static List<ItemInfo> AllItems = new List<ItemInfo>
{
new ItemInfo{ID = 1, ItemType = ItemType.Shop, Name = "Wasserflasche", usable = true, Thirst = 50, Hunger = 0, Weight = 0.50m, SalesPrice = 2.50m, PurchasePrice = 5, ItemUseAnimation = new Animation("Trinken", "amb@world_human_drinking@coffee@female@idle_a", "idle_a", (AnimationFlags.OnlyAnimateUpperBody | AnimationFlags.AllowPlayerControl)) },
new ItemInfo{ID = 2, ItemType = ItemType.Sale, Name = "Sandwich", usable = true, Thirst = 0, Hunger = 50, Weight = 0.5m, PurchasePrice = 10, SalesPrice = 5, ItemUseAnimation = new Animation("Essen", "mp_player_inteat@pnq", "intro", 0) },
new ItemInfo{ID = 3, ItemType = (ItemType.Shop|ItemType.Process), Name = "Apfel", FarmType = FarmTypes.Apfel, usable = true, Thirst = 25, Hunger = 25, Weight = 0.5m, PurchasePrice = 5, SalesPrice = 2, ItemFarmAnimation = new Animation("Apfel", "amb@prop_human_movie_bulb@base","base", AnimationFlags.Loop)},
new ItemInfo{ID = 4, ItemType = ItemType.Process, Name = "Brötchen", usable = true, Thirst = -10, Hunger = 40, Weight = 0.5m, PurchasePrice = 7.50m, SalesPrice = 4}
}
然后我循环遍历列表并询问是否设置了标志 ItemType.Shop
,如下所示:
List<ItemInfo> allShopItems = ItemInfo.AllItems.ToList();
foreach(ItemInfo i in allShopItems)
{
if (i.ItemType.HasFlag(ItemType.Shop))
{
API.consoleOutput(i.Name);
}
}
这是我的循环的输出 - 它显示了列表中的所有项目,在这种情况下 .HasFlag
方法总是 returns true。
Wasserflasche
Sandwich
Apfel
Brötchen
尝试为您的枚举赋值
[Flags]
public enum ItemType
{
Shop = 1,
Farm = 2,
Weapon = 4,
Process = 8,
Sale = 16
}
这里有 一些 Guidelines for FlagsAttribute and Enum(摘自 Microsoft Docs)
- 仅当要对数值执行按位运算(AND、OR、EXCLUSIVE OR)时,才将 FlagsAttribute 自定义特性用于枚举。
- 以2的幂定义枚举常量,即1、2、4、8等。这意味着组合枚举常量中的各个标志不会重叠。
您应该为您的枚举赋值。 flags 属性所做的只是更改 ToString 方法的工作方式。我会使用按位运算符来减少出错的可能性:
[Flags]
public enum ItemType
{
Shop = 1 << 0, // == 1
Farm = 1 << 1, // == 2
Weapon = 1 << 2, // == 4
Process = 1 << 3, // == 8
Sale = 1 << 4 // == 16
}
我有一个带有这样标志的枚举:
[Flags]
public enum ItemType
{
Shop,
Farm,
Weapon,
Process,
Sale
}
然后我在列表中有几个对象,其中一些设置了标志,一些标志未设置。它看起来像这样:
public static List<ItemInfo> AllItems = new List<ItemInfo>
{
new ItemInfo{ID = 1, ItemType = ItemType.Shop, Name = "Wasserflasche", usable = true, Thirst = 50, Hunger = 0, Weight = 0.50m, SalesPrice = 2.50m, PurchasePrice = 5, ItemUseAnimation = new Animation("Trinken", "amb@world_human_drinking@coffee@female@idle_a", "idle_a", (AnimationFlags.OnlyAnimateUpperBody | AnimationFlags.AllowPlayerControl)) },
new ItemInfo{ID = 2, ItemType = ItemType.Sale, Name = "Sandwich", usable = true, Thirst = 0, Hunger = 50, Weight = 0.5m, PurchasePrice = 10, SalesPrice = 5, ItemUseAnimation = new Animation("Essen", "mp_player_inteat@pnq", "intro", 0) },
new ItemInfo{ID = 3, ItemType = (ItemType.Shop|ItemType.Process), Name = "Apfel", FarmType = FarmTypes.Apfel, usable = true, Thirst = 25, Hunger = 25, Weight = 0.5m, PurchasePrice = 5, SalesPrice = 2, ItemFarmAnimation = new Animation("Apfel", "amb@prop_human_movie_bulb@base","base", AnimationFlags.Loop)},
new ItemInfo{ID = 4, ItemType = ItemType.Process, Name = "Brötchen", usable = true, Thirst = -10, Hunger = 40, Weight = 0.5m, PurchasePrice = 7.50m, SalesPrice = 4}
}
然后我循环遍历列表并询问是否设置了标志 ItemType.Shop
,如下所示:
List<ItemInfo> allShopItems = ItemInfo.AllItems.ToList();
foreach(ItemInfo i in allShopItems)
{
if (i.ItemType.HasFlag(ItemType.Shop))
{
API.consoleOutput(i.Name);
}
}
这是我的循环的输出 - 它显示了列表中的所有项目,在这种情况下 .HasFlag
方法总是 returns true。
Wasserflasche
Sandwich
Apfel
Brötchen
尝试为您的枚举赋值
[Flags]
public enum ItemType
{
Shop = 1,
Farm = 2,
Weapon = 4,
Process = 8,
Sale = 16
}
这里有 一些 Guidelines for FlagsAttribute and Enum(摘自 Microsoft Docs)
- 仅当要对数值执行按位运算(AND、OR、EXCLUSIVE OR)时,才将 FlagsAttribute 自定义特性用于枚举。
- 以2的幂定义枚举常量,即1、2、4、8等。这意味着组合枚举常量中的各个标志不会重叠。
您应该为您的枚举赋值。 flags 属性所做的只是更改 ToString 方法的工作方式。我会使用按位运算符来减少出错的可能性:
[Flags]
public enum ItemType
{
Shop = 1 << 0, // == 1
Farm = 1 << 1, // == 2
Weapon = 1 << 2, // == 4
Process = 1 << 3, // == 8
Sale = 1 << 4 // == 16
}