我的代码中有以下enum
:
[Flags]
public enum Column
{
FirstName = 1 << 0,
LastName = 1 << 1,
Address = 1 << 2,
}
现在我的方法可以采用enum
。
public void ParseColumns(Column col)
{
//do some parsing...
}
可以像这样调用此方法:
ParseColumns(Column.FirstName | Column.LastName);
ParseColumns(Column.LastName);
ParseColumns(Column.LastName | Column.Address | Column.FirstName);
ParseColumns(Column.Address | Column.FirstName);
我现在需要遍历值,但保持enum
传递给方法的顺序。
我找到了以下方法,它让我有可能迭代它们,但遗憾的是它返回它在Enum
本身中定义的顺序,而不是我如何调用该方法。
Iterate over values in Flags Enum?
答案 0 :(得分:8)
我现在需要迭代值,但保持枚举传递给方法的顺序。
没有这样的概念。 |
运算符没有任何保留排序的方法。换句话说,想象我们有:
public void Foo(int x)
你打电话给:
Foo(1 + 4)
Foo(2 + 3)
您期望它如何区分?如果您需要使用特定的保留顺序传递单独的值,则应该使用:
public void ParseColumns(params Column[] columns)
......此时你可能想要避免它成为一个标志枚举。
答案 1 :(得分:3)
这根本不可能。
标志枚举值的工作原理是添加各个项目的值(每个项目都是一个唯一的位)。
添加是可交换的,因此您无法分辨它们的添加顺序。
考虑接受(params
)非标记枚举值数组。
答案 2 :(得分:0)
它不可能,但是一个有趣但不太好的想法...
你可以做的是组合一个扩展方法(因为运算符重载不起作用)与位移...序列化然后反序列化值...仍然听起来像一个坏主意,哈哈哈。
public static Column OR(this Column original, Column newc) {
return (Column) ((int)original)| (((int) newc) << 3)
}
public static Column Get(this Column original) {
// Some iterator that looks almost like the one you already have
}
public static Column GetOrder(this Column original) {
// Some iterator that looks almost like the one you already have
}
然后您可以按如下方式调用
ParseColumns(Column.FirstName.OR(Column.LastName))
然后实现类似于:
public void ParseColumns(Column col)
{
col.Get();
col.GetOrder();
}
检查这样的事情是否适合你