Получить имена Enum, соответствующие целочисленному значению, когда Enum отмечен флагом - PullRequest
0 голосов
/ 01 августа 2020

Рассмотрим следующее перечисление:

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 и знаю, что он возвращает Enum с "Yellow" и "Green" в нем. Но как я могу получить список имен?

Примечание: просто чтобы упомянуть, я знаю только тип Enum во время выполнения.

Ответы [ 6 ]

1 голос
/ 01 августа 2020

Вот еще один подход, аналогичный тому, что опубликовал Фил Росс, но с использованием 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));
1 голос
/ 01 августа 2020

Вам нужно использовать [Flags] с перечислением.

[Flags]
public enum Color 
{
  None = 0,
  Yellow = 1,
  Green = 2,
  Blue = 4
}

var twoOrThree = Color.Green | Color.Blue;
Console.WriteLine(twoOrThree.ToString());  

Он будет печатать зеленый, синий

1 голос
/ 01 августа 2020

Вы можете использовать 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"}
0 голосов
/ 01 августа 2020

Используя подход Flags , предложенный vivek nuna, вы можете обмануть и сделать:

[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());
}
0 голосов
/ 01 августа 2020

Хотя вы можете записать все имена в строку [], а затем просто сослаться на нее, в Enums есть функция, которая позволяет вам получить имя, связанное со значением.

enum Color 
{
  None = 0,
  Yellow = 1,
  Green = 2,
  Blue = 4
}

public void SomeMethod() {
    string enumName = enum.GetName(typeof(Color), 2)
    // enumName = Green
}

MSDN также есть хороший пример

0 голосов
/ 01 августа 2020

Чтобы получить элементы перечисления, введите

string[] enums = Enum.GetNames(typeof(myEnum))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...