将多个枚举传递给方法并获取它们的值
Pass multiple enum to methods and get their values
请考虑此代码:
public enum Status
{
S1 = 1,
S2 = 2,
S3 = 3,
S4 = 4
}
我知道我可以使用 |
运算符将多个枚举传递给一个方法:
public void DoWork(Status S)
{
}
...
DoWork(Status.S1 | Status.S2);
现在在 DoWork 方法中,我想获取传递的枚举的值。例如在上面的代码中我想得到 {1, 2}
。我如何做到这一点?
谢谢
以下是获得标记枚举的几个步骤:
- 使用
2 exp (n)
整数(1, 2, 4, 8, 16, 32, ...)
定义你的枚举。 为什么? : 其实你的每一个活跃状态
枚举将采用 32 位整数中的一位。
- 添加 Flags 属性。
然后,
[Flags]
public enum Status
{
S1 = 1,
S2 = 2,
S3 = 4,
S4 = 8
}
您可以使用 Enum.HasFlag 检查特定状态是否有效:
public void DoWork(Status s)
{
var statusResult = Enum.GetValues(typeof(Status)).Where(v => s.HasFlag(v)).ToArray() ;
// StatusResult should now contains {1, 2}
}
使用 params 标签声明你的参数,然后你会得到一个枚举数组:
public void DoWork (params Status[] args) {
Console.WriteLine(args.Length);
}
那么你只需将它们作为常规参数传入即可:
DoWork(Status.S1, Status.S2);
这不需要更改您的枚举,并且可以轻松应对额外的值。上面的标志解决方案也可能适用于您 - 取决于您的要求。
如果这是您想要的枚举的整数值,您可以使用它:
//declare your enum as byte
public enum Status : byte
{...}
**EDITED**
//then cast it to int to use the value
DoWork((int)Status.S1 , (int)Status.S2);
//change doWork to accept int[]
public void DoWork (params int[] args)
请考虑此代码:
public enum Status
{
S1 = 1,
S2 = 2,
S3 = 3,
S4 = 4
}
我知道我可以使用 |
运算符将多个枚举传递给一个方法:
public void DoWork(Status S)
{
}
...
DoWork(Status.S1 | Status.S2);
现在在 DoWork 方法中,我想获取传递的枚举的值。例如在上面的代码中我想得到 {1, 2}
。我如何做到这一点?
谢谢
以下是获得标记枚举的几个步骤:
- 使用
2 exp (n)
整数(1, 2, 4, 8, 16, 32, ...) 定义你的枚举。 为什么? : 其实你的每一个活跃状态 枚举将采用 32 位整数中的一位。 - 添加 Flags 属性。
然后,
[Flags]
public enum Status
{
S1 = 1,
S2 = 2,
S3 = 4,
S4 = 8
}
您可以使用 Enum.HasFlag 检查特定状态是否有效:
public void DoWork(Status s)
{
var statusResult = Enum.GetValues(typeof(Status)).Where(v => s.HasFlag(v)).ToArray() ;
// StatusResult should now contains {1, 2}
}
使用 params 标签声明你的参数,然后你会得到一个枚举数组:
public void DoWork (params Status[] args) {
Console.WriteLine(args.Length);
}
那么你只需将它们作为常规参数传入即可:
DoWork(Status.S1, Status.S2);
这不需要更改您的枚举,并且可以轻松应对额外的值。上面的标志解决方案也可能适用于您 - 取决于您的要求。
如果这是您想要的枚举的整数值,您可以使用它:
//declare your enum as byte
public enum Status : byte
{...}
**EDITED**
//then cast it to int to use the value
DoWork((int)Status.S1 , (int)Status.S2);
//change doWork to accept int[]
public void DoWork (params int[] args)