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

时间:2015-02-26 09:41:05

标签: c# c#-4.0 enums

请考虑以下代码:

public enum Status
{
    S1 = 1,
    S2 = 2,
    S3 = 3,
    S4 = 4
}

我知道我可以使用| oerator将多个枚举传递给方法:

public void DoWork(Status S)
{
}
...
DoWork(Status.S1 | Status.S2);

现在在DoWork方法中我想获取传递的枚举值。例如在上面的代码中,我想获得{1, 2}。我怎么做这个? 感谢

3 个答案:

答案 0 :(得分:5)

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

  1. 使用2 exp (n)整数(1,2,4,8,16,32,...) 定义你的枚举。 为什么?:实际上你的每个活跃状态 枚举将取一个32位整数的位。
  2. 添加Flags属性。
  3. 然后,

        [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}
    } 
    

答案 1 :(得分:3)

使用params标记声明参数,然后得到一个枚举数组:

public void DoWork (params Status[] args) {
    Console.WriteLine(args.Length);
}

然后你只需将它们作为常规参数传递:

DoWork(Status.S1, Status.S2);

这不需要更改您的枚举,并且可以轻松应对其他值。上面的标志解决方案也可能适合您 - 取决于您的要求。

答案 2 :(得分:0)

如果这是你想要的枚举的整数值,你可以使用它:

//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)