我不时会看到如下的枚举:
[Flags]
public enum Options
{
None = 0,
Option1 = 1,
Option2 = 2,
Option3 = 4,
Option4 = 8
}
Run Code Online (Sandbox Code Playgroud)
我不明白[Flags]-attribute 到底是做什么的.
任何人都可以发布一个很好的解释或示例?
我下面有一个标志枚举.
[Flags]
public enum FlagTest
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4
}
Run Code Online (Sandbox Code Playgroud)
我无法将if语句评估为true.
FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;
if (testItem == FlagTest.Flag1)
{
// Do something,
// however This is never true.
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
如果我有一个包含标志枚举的变量,我可以以某种方式迭代该特定变量中的位值吗?或者我是否必须使用Enum.GetValues迭代整个枚举并检查哪些枚举?
我有一个标有[Flags]属性的Enum,如下所示:
[Flags]
public enum Tag : int
{
None = 0,
PrimaryNav = 1,
HideChildPages = 2,
HomePage = 4,
FooterLink = 8
}
Run Code Online (Sandbox Code Playgroud)
在我的站点地图中的站点地图节点上,我将标签组合的int值存储为属性.
我需要做的是检查一个节点是否有一个或多个标签中的任何一个,例如Tag.PrimaryNav | Tag.HomePage.
我正在努力使用必要的布尔逻辑来确定Enum值是否具有与其进行比较的一个或多个值.
如果不清楚,请道歉.如有必要,我可以提供更多信息.
我正在尝试新的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) EDIT:
Most people suggest that flag enums should always have values of powers of two. That may be best practice but I am not defining enums here, rather checking them and want to cover all possible scenarios within reason. The question is really about the proper way to implement the function named EnumUtilities.IsValueDefinedAndComposite<T>.
ORIGINAL POST:
Consider the following Enum:
[Flags]
public enum TestWithFlags { One = 1, Two = 2, }
Run Code Online (Sandbox Code Playgroud)
Following is the result of Enum.IsDefined with various …
我正在尝试检查“枚举实例”是否包含多个标志。
[Flags]
public enum Foo
{
Bar = 1,
Far = 2
}
Run Code Online (Sandbox Code Playgroud)
var multiState = Foo.Bar | Foo.Far;
MoreThanOneFlag(multiState); // True
var singleState = Foo.Bar;
MoreThanOneFlag(singleState); // False
Run Code Online (Sandbox Code Playgroud)
另外我真的不想使用类似下面的东西:
var state = Foo.Bar | Foo.Far;
Console.WriteLine(state.ToString().Count(x => x == ',') > 0); // True
Run Code Online (Sandbox Code Playgroud)
请注意,我不关心“实例”包含哪些标志,我只想知道是否有多个标志。