AFg*_*one 37 c# enums enum-flags
我想知道将enum标志的所有位设置为1 的通用方法.我只想enum为所有比较返回一个,而不管其他枚举.
这段代码有效;
[Flags]
public enum SomeRightEnum : uint
{
CanDoNothing = 0,
CanDoSomething = 1 << 0,
CanDoSomethingElse = 1 << 1,
CanDoYetAnotherThing = 1 << 2,
...
DoEverything = 0xFFFFFFFF
}
Run Code Online (Sandbox Code Playgroud)
但是在上面的代码中,因为它是uint我们设置"F"的数量,如果是的话它将不起作用int.
所以,我会感激的所有位设置的一个通用的方法enum标志为1,而不管数据类型(iNT, int64,uint等)
lep*_*pie 58
最简单的可能是:
enum Foo
{
blah = 1,
....
all = ~0
}
Run Code Online (Sandbox Code Playgroud)
对于基于unsigned的枚举:
enum Foo : uint
{
blah = 1,
....
all = ~0u;
}
Run Code Online (Sandbox Code Playgroud)
rea*_*gos 22
[Flags]
public enum MyEnum
{
None = 0,
First = 1 << 0,
Second = 1 << 1,
Third = 1 << 2,
Fourth = 1 << 3,
All = ~(-1 << 4)
}
Run Code Online (Sandbox Code Playgroud)
小智 7
internal static class Program
{
private static void Main()
{
Console.WriteLine(Foo.Everything.HasFlag(Foo.None)); // False
Console.WriteLine(Foo.Everything.HasFlag(Foo.Baz)); // True
Console.WriteLine(Foo.Everything.HasFlag(Foo.Hello)); // True
}
}
[Flags]
public enum Foo : uint
{
None = 1 << 0,
Bar = 1 << 1,
Baz = 1 << 2,
Qux = 1 << 3,
Hello = 1 << 4,
World = 1 << 5,
Everything = Bar | Baz | Qux | Hello | World
}
Run Code Online (Sandbox Code Playgroud)
这是你想要的吗?
如果有人想知道:我需要为WPF构建一个Bindable enumconverter.
由于我不知道这些值在Reflection中意味着什么,我需要手动切换值(将它们绑定到复选框pe)
将Flagged枚举的值设置为-1以设置所有位时出现问题.
如果将其设置为-1并且取消标记所有值,则不会导致0,因为所有未使用的位都不会被标记.
这对我的情况最好.
SomeRightEnum someRightEnum = SomeRightEnum.CanDoNothing;
Type enumType = someRightEnum.GetType();
int newValue = 0;
var enumValues = Enum.GetValues(enumType).Cast<int>().Where(e => e == 1 || e % 2 == 0);
foreach (var value in enumValues)
{
newValue |= value;
}
Console.WriteLine(newValue);
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要扩展方法:
public static class FlagExtensions
{
public static TEnum AllFlags<TEnum>(this TEnum @enum)
where TEnum : struct
{
Type enumType = typeof(TEnum);
long newValue = 0;
var enumValues = Enum.GetValues(enumType);
foreach (var value in enumValues)
{
long v = (long)Convert.ChangeType(value, TypeCode.Int64);
if(v == 1 || v % 2 == 0)
{
newValue |= v;
}
}
return (TEnum)Enum.ToObject(enumType , newValue);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17102 次 |
| 最近记录: |