我有一个字符串值数组,我想在Flags Enum对象上设置标志.我有几个这样的,并且正在寻找一种更通用的方式来传递Flags枚举的类型,而不必为每个Flags Enum类型复制方法.这就是我目前所拥有的:
public static MyFlagsEnum ParseFlagsEnum(string[] values)
{
MyFlagsEnum flags = new MyFlagsEnum();
foreach (var flag in values)
{
flags |= (MyFlagsEnum)Enum.Parse(typeof(MyFlagsEnum), flag);
}
return flags;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更通用的方法来做同样的事情,同时能够使用任何Flags Enum类型.
假设我有以下代码:
[Flags]
enum MyFlags
{
None = 0,
A = 1,
B = 2,
C = 4,
D = 8,
E = 16,
// ...
}
Run Code Online (Sandbox Code Playgroud)
当标志量变得非常大时,这显然不是最佳的.并通过最佳,平均可读,不快速或节省内存.
对于组合标志,例如
AB = 3
Run Code Online (Sandbox Code Playgroud)
我们可以轻松使用
AB = A | B
Run Code Online (Sandbox Code Playgroud)
相反,它更具可读性.
并用于组合所有标志
All = A | B | C | ...
Run Code Online (Sandbox Code Playgroud)
它会更有利于使用
All = ~None
Run Code Online (Sandbox Code Playgroud)
相反,即使我们没有充分利用所有可用的32/64位.
但是常规价值呢?
之间
E = 16
E = 0b10000
E = 0x10
E = 1 << 4
Run Code Online (Sandbox Code Playgroud)
或其他我没有想到的方法,哪种方式最适合大量的旗帜?
或者换句话说,在C#中为标志设置值的(商定的)约定是什么?
让我们假设为了论证,值不会对齐,所以代码可能看起来像这样
None = 0,
Apple = 1,
Banana = …Run Code Online (Sandbox Code Playgroud) 尝试从枚举值获取所有可能标志的数组,例如 3 到 {1, 2} 的数组。
我有一个扩展
internal static MyEnum[] GetFlags(this MyEnum modKey)
{
string[] splitStr = modKey.ToString().Split(new string[1] { ", " }, StringSplitOptions.RemoveEmptyEntries);
MyEnum[] flags = new MyEnum[splitStr.Length];
for (int i = 0; i < splitStr.Length; i++)
{
flags[i] = (MyEnum)Enum.Parse(typeof(MyEnum), splitStr[i]);
}
return flags;
}
Run Code Online (Sandbox Code Playgroud)
……但这似乎有点浪费。这可以更有效地完成吗?
我想比较两个标志,看看它们是否有共同的值。
我希望有一个扩展方法,以便“加速”编码(我将经常在各种枚举类型上使用它)。我怎么能够?
这段代码告诉我:
运算符“&”不能应用于 enum 和 enum 类型的操作数
public enum Tag
{
Value1 = 1,
Value2 = 2,
Value3 = 4,
Value4 = 8,
Value5 = 16
}
public static class FlagExt
{
public static bool HasAny(this Enum me, Enum other)
{
return (me & other) != 0;
}
}
public class Program
{
public static void Main()
{
Tag flag1 = Tag.Value1 | Tag.Value2 | Tag.Value3;
Tag flag2 = Tag.Value2 | Tag.Value3 | Tag.Value4;
Console.WriteLine(flag1.HasAny(flag2)); // it should returns …Run Code Online (Sandbox Code Playgroud) 所以我有一个标志枚举
public Enum test
{
test1 = 1,
test2 = 2,
test3 = 4,
etc.
}
Run Code Online (Sandbox Code Playgroud)
如何测试那一位,只设置一位?
我以前100%完成了这个,但是我的思绪不是这样的!