Как сравнить 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 шт):
Судя по наименованию 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();
Есть вариант с расширением через сравнение интов
Добавьте класс
public static class AllowedNumsExtensions
{
public static bool SameValue(this AllowedNums a, Nums b)
{
return (int)a == (int)b;
}
}
Тогда можно вот так
if (a.SameValue(b))
{
Console.WriteLine("Работает");
}
