我正在尝试新的HasFlags功能,并想知道以下是否应该工作:
enum.HasFlag(AccessRights.Read | AccessRights.Write)
......因为它似乎不...
DBAccessRights rights = (DBAccessRights)permission.PermissionFlags;
if (rights.HasFlag(DBAccessRights.WikiMode))
{
// works
}
if (rights.HasFlag(DBAccessRights.WikiMode | DBAccessRights.CreateNew))
{
// Doesn't work
}
DBAccessRights flags = DBAccessRights.WikiMode | DBAccessRights.CreateNew;
if (rights.HasFlag(flags))
{
// Doesn't work
}
Run Code Online (Sandbox Code Playgroud) 我注意到这两个模式用于检查枚举标志:
[Flags]
public enum PurchaseType
{
None = 0,
SalePrice = 2,
RegularPrice = 4,
Clearance = 8,
CreditCard = 16
}
public void Test()
{
PurchaseType type = PurchaseType.Clearance;
type |= PurchaseType.CreditCard;
// Practice 1
if ((type & PurchaseType.Clearance) == PurchaseType.Clearance)
{
// Clearance item handling
}
// Practice 2
if ((type & PurchaseType.CreditCard) != 0)
{
// Credit card item handling
}
}
Run Code Online (Sandbox Code Playgroud)
在检查枚举标志的两种方法中,哪一种更好,性能,可读性,代码健康以及我应该做出的任何其他考虑?
谢谢,穆罕默德
我有一个枚举属性,我试图通过复选框设置其值.枚举枚举,当用户选择多个选项时,我希望该属性连接所有选定的标志.
我尝试为每个枚举值添加一个复选框,并为每个复选框指定相同的名称.在回发期间,检索第一个选定的标志但不与其他标志连接.
如果不为每个标志分别拥有单独的属性,我可以以某种方式修复
public class HomeModel
{
public Fruit MyFruits { get; set; }
}
[Flags] public enum Fruit
{
Love = 1,
Joy = 2,
Peace = 4,
Patience = 8,
Kindness = 16,
Goodness = 32,
Faithfulness = 64,
Gentleness = 128,
SelfControl = 256
}
Run Code Online (Sandbox Code Playgroud)
@model EnumFlagTest.Models.HomeModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@using (Html.BeginForm())
{
<h1>Fruits</h1>
<div><label>@EnumFlagTest.Models.Fruit.Love.ToString() <input type="checkbox" name="MyFruits" value="@((int) EnumFlagTest.Models.Fruit.Love)" @(Model.MyFruits.HasFlag(EnumFlagTest.Models.Fruit.Love) …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用GenericsC#但很早就遇到了问题,我怎样才能调用.HasFlag()泛型Enum呢?
public class Example<TEnum> where TEnum : struct {
}
Run Code Online (Sandbox Code Playgroud)
如何向其添加[Flags]属性?
可能重复:
枚举返回int值
如何从枚举中获取数值?
这不是这些的重复,感谢阅读问题模式
假设我选择了许多标志枚举项:
[Flags]
public enum Options
{
None = 0,
Option_A = 1,
Option_B = 2,
Option_C = 4,
Option_D = 8,
}
Options selected = Options.Option_A | Options.Option_B;
Run Code Online (Sandbox Code Playgroud)
值selected应该对应于3(即2 + 1)
我怎样才能把它变成一个int?
我已经看到了selected将ToString()和split()转换为每个选项的示例,例如
"Option_A | Option_B" --> { "Option_A", "Option_B" },
Run Code Online (Sandbox Code Playgroud)
然后重新组合成各自的Enum,并从中获取值,但它有点凌乱.是否有更直接的方法来获得这些值的总和?
考虑我有这个扩展方法:
public static bool HasAnyFlagInCommon(this System.Enum type, Enum value)
{
var flags = value.ToString().Split(new string[] { ", " },
StringSplitOptions.None);
foreach (var flag in flags)
{
if (type.ToString() == flag)
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
以下情况:
[Flags]
enum Bla
{
A = 0,
B = 1,
C = 2,
D = 4
}
Bla foo = Bla.A | Bla.B;
Bla bar = Bla.A;
bar.HasAnyFlagInCommon(foo); //returns true
Run Code Online (Sandbox Code Playgroud)
我想检查foo是否有任何与bar相同的标志,但是在扩展方法中必须有更好的方法来实现这种行为.
我也尝试过这样,但总是返回true:
public static bool HasAnyFlagInCommon(this System.Enum type, Enum value)
{
var flags …Run Code Online (Sandbox Code Playgroud) 我有以下枚举标志:
[Flags]
private enum MemoryProtection: uint
{
None = 0x000,
NoAccess = 0x001,
ReadOnly = 0x002,
ReadWrite = 0x004,
WriteCopy = 0x008,
Execute = 0x010,
ExecuteRead = 0x020,
ExecuteReadWrite = 0x040,
ExecuteWriteCopy = 0x080,
Guard = 0x100,
NoCache = 0x200,
WriteCombine = 0x400,
Readable = (ReadOnly | ReadWrite | ExecuteRead | ExecuteReadWrite),
Writable = (ReadWrite | WriteCopy | ExecuteReadWrite | ExecuteWriteCopy)
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个枚举实例,我需要检查它是否可读.如果我使用以下代码:
myMemoryProtection.HasFlag(MemoryProtection.Readable)
Run Code Online (Sandbox Code Playgroud)
它总是在我的情况下返回false,因为我认为HasFlag检查它是否有每个标志.我需要优雅的东西来避免这样做:
myMemoryProtection.HasFlag(MemoryProtection.ReadOnly) ||
myMemoryProtection.HasFlag(MemoryProtection.ReadWrite) ||
myMemoryProtection.HasFlag(MemoryProtection.ExecuteRead) ||
myMemoryProtection.HasFlag(MemoryProtection.ExecuteReadWrite)
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我需要将具有3个bool属性的遗留类转换为标记枚举.
我知道至少有一个属性是真的.
[Flags]
public enum FlagEnum
{
EnumValue1 = 1,
EnumValue2 = 2,
EnumValue3 = 4
}
public class LegacyClass
{
public bool PropA { get; set; }
public bool PropB { get; set; }
public bool PropC { get; set; }
}
public class DtoClass
{
public FlagEnum FlagEnum { get; set; }
public DtoClass(LegacyClass legacyClass)
{
if (!legacyClass.PropA && !legacyClass.PropB && !legacyClass.PropC)
{
throw new ArgumentException();
}
if (legacyClass.PropA)
{
FlagEnum = FlagEnum.EnumValue1;
}
if (legacyClass.PropB)
{
if …Run Code Online (Sandbox Code Playgroud) 我只是想将我的代码从C#转换为Haxe NME.我使用枚举作为标志.
[Flags]
enum State
{
StateOne = 1,
StateTwo = 2,
StateThree = 4
}
Run Code Online (Sandbox Code Playgroud)
并使用它
if (someObj.HasState(State.StateOne | State.StateTwo))
{
// Contains both the states. Do something now.
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何在Haxe NME中这样做.
谢谢.
我遇到过这个问题:[Flags]枚举属性在C#中意味着什么?
有一点我一直想知道,使用接受的答案的例子,如果我宣布会发生什么:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 3,
Blue = 4
}
Run Code Online (Sandbox Code Playgroud)
该示例中的以下步骤是否会导致错误?如果不是,我怎样才能进入MyColors.Red?
enum-flags ×10
c# ×9
enums ×9
flags ×3
.net ×2
.net-4.0 ×1
asp.net-mvc ×1
generics ×1
haxe ×1
nme ×1