【问题标题】:Pass multiple enum to methods and get their values将多个枚举传递给方法并获取它们的值
【发布时间】:2015-02-26 09:41:04
【问题描述】:

请考虑以下代码:

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}。我该怎么做? 谢谢

【问题讨论】:

  • 您应该使用 2 的幂作为值 (1, 2, 4, 8...),并使用 [Flags] 属性标记 Status 枚举。
  • @Sharped 在那个问题中,我没有看到解释如何将(标志)枚举转换为枚举值数组/列表的响应
  • @Sharped :不,这不是该主题的重复。我想获取枚举值

标签: c# c#-4.0 enums


【解决方案1】:

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

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

【讨论】:

  • 从 .NET 4.0 开始有一个 HasFlag 而不是使用 &
  • Enum.GetValues 返回一个数组。 linq Where 无法从使用中推断出类型,因此需要强制转换。 var statusResult = Enum.GetValues(typeof(Status)).Cast<Status>().Where(v => s.HasFlag(v)).ToArray();
【解决方案2】:

用 params 标签声明你的参数,然后你会得到一个枚举数组:

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

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

DoWork(Status.S1, Status.S2);

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • @Kerezo 代码已编辑,抱歉我没有意识到'|'会将 param1 添加到 param 2
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 2017-01-06
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多