将多个枚举传递给方法并获取它们的值

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}。我如何做到这一点? 谢谢

以下是获得标记枚举的几个步骤:

  1. 使用 2 exp (n) 整数(1, 2, 4, 8, 16, 32, ...) 定义你的枚举。 为什么? : 其实你的每一个活跃状态 枚举将采用 32 位整数中的一位。
  2. 添加 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)