Как сравнить 2 разных enum

class Program
{
    static void Main(string[] args)
    {
        var a = AllowedNums.One;
        var b = Nums.Two;

        if (a.HasFlag(b))
        {
            Console.WriteLine("Работает");
        }

    }
}
public enum AllowedNums
{
    One,
    Two
}
public enum Nums
{
    One,
    Two,
    Three
}

Вот это вызывает ошибку. Говорит, что не совпадают типы, что логично. Мне пришло в голову несколько идей как это исправить, а именно: с помощью switch case и с помощью ToString() (в if), но мне кажутся эти пути не красивыми. Их так и хочется удалить и сидеть вечерами думать о том, как их исправить.


Ответы (2 шт):

Автор решения: A K

Судя по наименованию Allowed у вас должен быть только один enum, а Allowed я бы указывал как IEnumerable/Array/IList:

var allowed = Enum.GetValues(typeof(Nums)).Cast<Nums>().Where(x => x != Nums.Tree);

Или сформировать практически как угодно через yield если linq-выражение в .Where получается неочевидным и запутанным:

public IEnumerable<Nums> GetAllowed()
{
    yield return Nums.One;
    yield return Nums.Two;
}

А проверка соответственно будет тривиальной:

public bool IsAllowed(IEnumerable<Nums> allowed, Nums num)
{
    return allowed.Any(x => x == num);
}

Как-то так в итоге:

var allowed = Enum.GetValues(typeof(Nums)).Cast<Nums>().Where(x => x != Nums.Tree);

IsAllowed(allowed, Nums.One).Dump();
IsAllowed(allowed, Nums.Two).Dump();
IsAllowed(allowed, Nums.Tree).Dump();

введите сюда описание изображения

→ Ссылка
Автор решения: aepot

Есть вариант с расширением через сравнение интов

Добавьте класс

public static class AllowedNumsExtensions
{
    public static bool SameValue(this AllowedNums a, Nums b)
    {
        return (int)a == (int)b;
    }
}

Тогда можно вот так

if (a.SameValue(b))
{
    Console.WriteLine("Работает");
}
→ Ссылка