【问题标题】:Get Enum names corresponding to the integer value when Enum is flagged当 Enum 被标记时,获取与整数值对应的 Enum 名称
【发布时间】:2020-08-01 15:08:15
【问题描述】:

考虑以下枚举:

enum Color 
{
  None = 0,
  Yellow = 1,
  Green = 2,
  Blue = 4
}
var enumType = typeof(Color);

var number = (int)(Color.Yellow | Color.Green);
// number equals to 3

现在我想要上述操作的逆向操作。我想知道什么枚举导致数字 3。比如:

string[] names = GetEnumNames(enumType, 3);
// It should return an array { "Yellow", "Green" }

我尝试过Enum.ToObject,我知道它会返回带有"Yellow""Green" 的枚举。但是我怎样才能得到名字列表呢?

注意:顺便提一下,我只知道 Enum 在运行时的类型。

【问题讨论】:

  • YellowGreen3 的连接如何??
  • Enum.GetNames 可以帮到你
  • @ClaudioRedi 3 是代表“黄色”和“绿色”按位运算的整数,例如:var number = (int)(Color.Yellow | Color.Green)number3
  • @PhilRoss 我最终使用了指向您发送的答案的链接。

标签: c# enums


【解决方案1】:

您可以使用Enum.GetValues() 获取所有值,然后过滤以找到匹配的值:

IEnumerable<string> GetEnumNames<T>(int value)
{
    return Enum.GetValues(typeof(T))
        .Cast<int>()
        .Where(i => i != 0 && (i & value) == i)
        .Cast<T>()
        .Select(i => i.ToString()); 
}

GetEnumNames<Color>(3); // => {"Yellow", "Green"}

【讨论】:

    【解决方案2】:

    您需要将[Flags] 与枚举一起使用。

    [Flags]
    public enum Color 
    {
      None = 0,
      Yellow = 1,
      Green = 2,
      Blue = 4
    }
    
    var twoOrThree = Color.Green | Color.Blue;
    Console.WriteLine(twoOrThree.ToString());  
    

    它将打印绿色、蓝色

    【讨论】:

    • ToString() 即使没有 [Flags] 也会打印它们,但直接获取名称似乎不同
    【解决方案3】:

    这是另一种类似于 Phil Ross 发布的方法,但使用 HasFlag

    Color colorCombo = Color.Yellow | Color.Green;
    
    String[] colors = Enum.GetValues(typeof(Color)).Cast<Color>()
        .Where(i => i != 0 && colorCombo.HasFlag(i)).Select(i => i.ToString()).ToArray();
    
    Console.WriteLine(String.Join(", ", colors));
    

    【讨论】:

      【解决方案4】:

      虽然您可以将所有名称放入一个字符串 [] 中然后引用它,但 Enums 有一个函数可以让您获取与值关联的名称。

      enum Color 
      {
        None = 0,
        Yellow = 1,
        Green = 2,
        Blue = 4
      }
      
      public void SomeMethod() {
          string enumName = enum.GetName(typeof(Color), 2)
          // enumName = Green
      }
      

      MSDN has a good example on it as well

      【讨论】:

      • 只测试 3 而不是 2,你会得到 null
      • 所有,没有意识到它正在处理按位运算。 Phil Ross 提出的解决方案很有效。我只是在研究它,但他打败了我,所以我不会编辑我的答案。
      【解决方案5】:

      使用 vivek nuna 建议的 Flags 方法,您可以作弊:

      [Flags]
      enum Color
      {
          None = 0,
          Yellow = 1,
          Green = 2,
          Blue = 4
      }
      
      static void Main(string[] args)
      {           
          var colorCombo = Color.Yellow | Color.Green;
          var colors = HasFlags(colorCombo);
          Console.WriteLine(String.Join(", ", colors));
      
          Console.Write("Press Enter to Quit");
          Console.ReadLine();
      }
      
      public static IEnumerable<String> HasFlags(Enum value)
      {
          return value.ToString().Split(",".ToCharArray()).Select(v => v.Trim());
      }
      

      【讨论】:

        【解决方案6】:

        要获取枚举项,请键入

        string[] enums = Enum.GetNames(typeof(myEnum))
        

        【讨论】:

        • 它没有回答我的问题。 Enum.GetNames 返回所有名称,而不是与特定整数相关的名称
        • string enumName = Enum.GetName((typeofmyEnum), 1) should do that for you
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 2021-08-26
        • 1970-01-01
        • 2018-10-20
        • 2011-06-02
        相关资源
        最近更新 更多